Код выглядит следующим образом:C - Стандартный выход порядка печати
printf("u");
write(STDOUT_FILENO, "m", 1);
printf("d\n");
выход: грязь
Может кто-нибудь объяснить, почему выход печатается в таком порядке?
Код выглядит следующим образом:C - Стандартный выход порядка печати
printf("u");
write(STDOUT_FILENO, "m", 1);
printf("d\n");
выход: грязь
Может кто-нибудь объяснить, почему выход печатается в таком порядке?
Стандартный вывод по умолчанию выполнен по умолчанию, что означает printf("u")
, будет помещать только "u"
в буфер, пока не появится fflush
или новый символ линии. Для того, чтобы увидеть результат в порядке, попробуйте следующее:
printf("u");
fflush(stdout);
write(STDOUT_FILENO, "m", 1);
printf("d\n");
printf
магазины «и» в буфере. write
записывает данные в основной файл. Следующий printf
помещает «d \ n» в буфер. В какой-то момент в будущем (либо когда программа выйдет, либо когда вы вызовете printf
достаточно, чтобы буфер был заполнен), буфер будет записан в базовый дескриптор файла.
Выход через стандартные потоки С буферизуется. Первый вызов printf
хранит u
в буфер, а вторая строка выводит m
непосредственно в стандартный дескриптор выходного файла системы через системный вызов write
, наконец, второй вызов printf хранит d
и линию в буфере и сбрасывает буфер для стандартного выходного дескриптора системы, либо потому, что вывод буферизирован по строке (который обычно является значением по умолчанию, если FILE*
связан с терминалом), а \n
вызывает сброс или потому, что поток сбрасывается при нормальном завершении программы.
stderr
небуферизован по умолчанию, попробуйте следующее:
fprintf(stderr, "u");
write(STDERR_FILENO, "m", 1);
fprintf(stderr, "d\n");
Где находится «терминал» в этом вопросе? Прекратите объединение stdout с tty. –
@WilliamPursell: Я согласен, я изменил ответ, чтобы быть более точным. – chqrlie
Нет, стандартный вывод не строки в буфер. * Если * связано с терминалом, то по умолчанию оно буферизируется по строке. Если это связано с трубой или обычным файлом, скорее всего, это не так. –
@WilliamPursell Можете ли вы показать ссылку на это? – fluter
http://man7.org/linux/man-pages/man3/setbuf.3.html –