2016-12-20 12 views
1

Почему этот фрагмент кода создает только буквы «XUVUV»? Я бы подумал, что «UXUVV» также будет возможностью, но я никогда не получаю этого вывода.Почему этот код с fork() производит только один вывод?

if (fork() == 0){ 
    printf("X"); 
} 

printf("U"); 
wait(NULL); 
printf("V"); 
+0

Может быть буферизирован. Попробуйте добавить новую строку ко всем вашим 'printf', которые будут очищать буфер в большинстве линейных ориентированных терминальных систем, например. 'printf (" X \ n ");' Альтернативно записывать в 'stderr', который (обычно) небуферируется, например. 'fprintf (stderr," X ");' – cdarke

+2

Можете ли вы объяснить, как вы думаете, что произойдет UXUVV? –

+2

В вашем коде нет ничего, что могло бы гарантировать тот или иной выход. Поэтому ваши ожидания необоснованны. Это зависит от времени/планировщика. И в вашей системе поведение времени/планировщика имеет тенденцию приводить к одному результату по сравнению с другим. Но в другой системе или даже в другой день результат может быть другим. – kaylum

ответ

4

Печатей новых строк нет; поэтому выход не появляется, пока процесс не завершится.

Детский процесс добавляет X в его буфер; родитель не печатает X. Затем ребенок добавляет U в буфер. Он ждет, но ожидание немедленно возвращается; у ребенка нет детей, чтобы ждать. Он добавляет V в буфер. Он завершается, поэтому очищается XUV.

Между тем, родитель добавил U в буфер; он ждет, пока ребенок закончит. Когда ребенок закончил, был напечатан XUV. Родитель добавляет V в буфер и завершает работу; его UV сбрасываются на выход.

В результате вы видите XUVUV каждый раз.

Вы не можете определить, добавляет ли ребенок свои символы в буфер до или после того, как родитель добавит свой буфер U в свой буфер, но вы знаете, что ребенок завершил работу до того, как родитель добавит V, поэтому выход определен если вы не делаете что-то вроде setvbuf(stdout, 0, _IONBF, 0), чтобы сделать стандартный вывод небуферизованным, прежде чем выполнять какие-либо операции вывода.

Если вы добавляете новые строки для каждой операции печати, все становится более сложным; время перестает быть определенным.