Подтвердить что ты не робот

Стандартные операции ввода-вывода C/U и UNIX

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

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

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

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

грязь

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

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

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

(на второй странице слайдов.)

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

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