У меня такой код:

for(i=1; i<=2; i++)
{
    fork();
    printf("x ");   
}

Я подсчитал, что x нужно распечатать 6 раз: дважды в первой итерации и 4 раза во второй.

Вместо этого X печатается 8 раз. Почему?

3
Sorin 19 Май 2013 в 18:21
2
Возможный дубликат fork () и вывода
 – 
hmjd
19 Май 2013 в 18:25

1 ответ

Лучший ответ

Из-за буферизации. Обычно stdout буферизируется по строке, поэтому

printf("x ");

Не сразу записывает "x " в терминал, а в выходной буфер. Это копируется, когда процесс fork() s, поэтому каждый из четырех процессов после второй итерации имеет два "x " в выходном буфере [один из родительского / перед разветвлением в первой итерации, один из вторая итерация] при выходе и всего распечатываются восемь x.

Очистите буфер сразу после printf("x ");, и будет напечатано только шесть.

7
Daniel Fischer 19 Май 2013 в 18:24
fflush(stdout); - это самый простой способ последовать совету Даниэля.
 – 
Alex North-Keys
19 Май 2013 в 19:00