Печатей новых строк нет; поэтому выход не появляется, пока процесс не завершится.
Детский процесс добавляет X
в его буфер; родитель не печатает X
. Затем ребенок добавляет U
в буфер. Он ждет, но ожидание немедленно возвращается; у ребенка нет детей, чтобы ждать. Он добавляет V
в буфер. Он завершается, поэтому очищается XUV
.
Между тем, родитель добавил U
в буфер; он ждет, пока ребенок закончит. Когда ребенок закончил, был напечатан XUV
. Родитель добавляет V
в буфер и завершает работу; его UV
сбрасываются на выход.
В результате вы видите XUVUV
каждый раз.
Вы не можете определить, добавляет ли ребенок свои символы в буфер до или после того, как родитель добавит свой буфер U
в свой буфер, но вы знаете, что ребенок завершил работу до того, как родитель добавит V
, поэтому выход определен если вы не делаете что-то вроде setvbuf(stdout, 0, _IONBF, 0)
, чтобы сделать стандартный вывод небуферизованным, прежде чем выполнять какие-либо операции вывода.
Если вы добавляете новые строки для каждой операции печати, все становится более сложным; время перестает быть определенным.
Может быть буферизирован. Попробуйте добавить новую строку ко всем вашим 'printf', которые будут очищать буфер в большинстве линейных ориентированных терминальных систем, например. 'printf (" X \ n ");' Альтернативно записывать в 'stderr', который (обычно) небуферируется, например. 'fprintf (stderr," X ");' – cdarke
Можете ли вы объяснить, как вы думаете, что произойдет UXUVV? –
В вашем коде нет ничего, что могло бы гарантировать тот или иной выход. Поэтому ваши ожидания необоснованны. Это зависит от времени/планировщика. И в вашей системе поведение времени/планировщика имеет тенденцию приводить к одному результату по сравнению с другим. Но в другой системе или даже в другой день результат может быть другим. – kaylum