2016-05-10 2 views

ответ

3

Стандартный вывод по умолчанию выполнен по умолчанию, что означает printf("u"), будет помещать только "u" в буфер, пока не появится fflush или новый символ линии. Для того, чтобы увидеть результат в порядке, попробуйте следующее:

printf("u"); 
fflush(stdout); 
write(STDOUT_FILENO, "m", 1); 
printf("d\n"); 
+0

Нет, стандартный вывод не строки в буфер. * Если * связано с терминалом, то по умолчанию оно буферизируется по строке. Если это связано с трубой или обычным файлом, скорее всего, это не так. –

+0

@WilliamPursell Можете ли вы показать ссылку на это? – fluter

+0

http://man7.org/linux/man-pages/man3/setbuf.3.html –

2

printf магазины «и» в буфере. write записывает данные в основной файл. Следующий printf помещает «d \ n» в буфер. В какой-то момент в будущем (либо когда программа выйдет, либо когда вы вызовете printf достаточно, чтобы буфер был заполнен), буфер будет записан в базовый дескриптор файла.

1

Выход через стандартные потоки С буферизуется. Первый вызов printf хранит u в буфер, а вторая строка выводит m непосредственно в стандартный дескриптор выходного файла системы через системный вызов write, наконец, второй вызов printf хранит d и линию в буфере и сбрасывает буфер для стандартного выходного дескриптора системы, либо потому, что вывод буферизирован по строке (который обычно является значением по умолчанию, если FILE* связан с терминалом), а \n вызывает сброс или потому, что поток сбрасывается при нормальном завершении программы.

stderr небуферизован по умолчанию, попробуйте следующее:

fprintf(stderr, "u"); 
write(STDERR_FILENO, "m", 1); 
fprintf(stderr, "d\n"); 
+0

Где находится «терминал» в этом вопросе? Прекратите объединение stdout с tty. –

+0

@WilliamPursell: Я согласен, я изменил ответ, чтобы быть более точным. – chqrlie