Это проблема буферизации .
Вызовы write
записывают непосредственно в дескриптор файла стандартного вывода. Эти записи небуферизованы .
Функция printf
записывает в stdout
, который в обычных случаях (когда stdout
подключен к терминалу) буферизируется по строке (вывод фактически написано на новой строке).
Но когда stdout
не подключен к терминалу, например, когда вы передаете вывод по конвейеру, тогда схема буферизации меняется. Он становится полностью буферизованным. Это означает, что буфер будет записан только при явном сбросе (или при заполнении буфера), что происходит при выходе из программы.
Следовательно, небуферизованный вывод из write
будет записан первым. Затем при выходе из программы будет записан буфер stdout
.
Если вы хотите одинакового поведения в обоих случаях, вы можете явно пропустить sh буфер stdout
самостоятельно:
write(STDOUT_FILENO, a, 4);
printf("AA\n");
fflush(stdout);
[Обратите внимание, что я изменил "magi c number" 1
на предопределенный символ POSIX STDOUT_FILENO
, который обычно легче понять, даже если быстро взглянуть на код .]