Вызов функции printf
помещает символы hello
в буфер, связанный с потоком stdout
.Впоследствии буфер очищается при выходе из процесса, и именно тогда мы видим вывод.Вы разветвились до того, как это произошло, поэтому два процесса выполняют очистку буфера в двух отдельных адресных пространствах при выходе из каждого из них.У каждого процесса есть копия потока с буфером и его содержимым hello
.
Когда поток stdout
подключен к интерактивному устройству (например, TTY в Unix), он буферизуется в строке.,Буферизация строки означает, что буфер очищается всякий раз, когда выводится символ новой строки.
Если мы очищаем буфер до fork
(например, путем печати новой строки или путем вызова fflush(stdout)
), тогда очистка происходит вродительский процесс.Буфер пуст в момент времени fork
;хотя дочерний процесс наследует его копию, в обоих процессах нечего очищать.
В дублированном случае вывода что-то на самом деле вызывается дважды.Это просто не printf
, а системный вызов write
, который отправляет буферизованные символы на устройство вывода.