Ответ 1
По умолчанию вывод в stdout
выполняется при буферизации по строке при подключении к терминалу. То есть, буфер очищается, когда он заполняется или когда вы добавляете новую строку.
Однако, если stdout
не подключен к терминалу, например, что происходит при перенаправлении вывода из вашей программы в файл, то stdout
становится полностью буферизованным. Это означает, что буфер будет сбрасываться и фактически записываться либо при заполнении, либо при явной очистке (что происходит, когда программа выходит).
Это означает, что вывод отдельного процесса, начинающегося с вашего кода (например, то, что происходит, когда вы вызываете system
), скорее всего, будет написан первым, так как буфер этого процесса будет очищен, когда этот процесс завершится, что находится перед вашим собственным процессом.
Что происходит при использовании перенаправления (или труб в этом случае):
- Ваш вызов
printf
записывается в буферstdout
. -
system
функция запускает новый процесс, который записывается в собственный буфер. - Когда внешний процесс (запущенный
system
вызовом) завершается, его буфер очищается и записывается. Ваш собственный буфер в вашем собственном процессе не затрагивается. - Ваш собственный процесс завершается, и ваш буфер
stdout
очищается и записывается.
Чтобы получить результат в "правильном" (или, по крайней мере, ожидаемом) порядке, вызовите fflush
перед вызовом system
, чтобы явно setbuf
stdout
или вызвать setbuf
до того, как какой-либо вывод полностью отключит буферизацию.