Стандартные операции ввода-вывода C и основы ввода-вывода UNIX - PullRequest
13 голосов
/ 14 декабря 2011

Вот очень простой вопрос, который у меня есть.На слайде с лекцией моего профессора есть пример, который я действительно не понимаю.

Она написала:

printf("u"); 
write(STDOUT_FILENO, "m", 1); 
printf("d\n");

... и сказала, что выход этого кода будет:

грязь

Я не понимаю.Поэтому, если кто-то понимает, почему это происходит, объясните мне.

Ссылка на этот вопрос:

http://lagoon.cs.umd.edu/216/Lectures/lect17.pdf

(на втором последнем слайде).

Ответы [ 2 ]

21 голосов
/ 14 декабря 2011

write - системный вызов - он реализуется интерфейсом между пользовательским режимом (в котором запускаются программы, подобные вашей) и ядром операционной системы (которое выполняет фактическую запись на диск при записи байтов в файл).

printf - это стандартная библиотечная функция C - она ​​реализуется библиотечным кодом, загруженным в вашу программу пользовательского режима.

Функции вывода стандартной библиотеки C буферизуют свои выходные данные по умолчанию до достижения конца строки. Когда буфер заполнен или завершен новой строкой, он записывается в файл посредством вызова write из реализации библиотеки.

Следовательно, вывод через printf не отправляется операционной системе write сразу. В вашем примере вы буферизуете букву «u», затем сразу же пишете букву «m», затем добавляете «d \ n» в буфер, и стандартная библиотека выполняет вызов write(STDOUT_FILENO, "ud\n");

10 голосов
/ 14 декабря 2011

По умолчанию stdout равно с линейной буферизацией ;он не сбрасывается на вывод, пока не встретит символ новой строки (или пока буфер не заполнится).

Таким образом, "u" находится в буфере до получения "d\n".Но write обходит этот буфер.

...