2013-07-03 2 views
6

Есть 2 различных программ, они невелики, например:вилка() в с использованием Printf

int main() 
{ 
     printf ("print hello"); 
     fork(); 
} 

int main() 
{ 
     printf ("print hello\n"); 
     fork(); 
} 

выход 1: `печать helloprint Привет

выход 2 : print hello

Вопрос в том, почему один с \n печатает только один раз, а первый - при nts это дважды?

ответ

8

Выполняется операция буферизации в вашей системе printf. В первом случае строка печатается в буфер, но поскольку нет новой строки (и вы не вызывали fflush), она просто сидит там в этом буфере. Затем вы используете fork, и оба разветвленных буфера очищаются, когда их соответствующие процессы выходят.

Во втором случае \n вызывает сброс буфера до, так что выход, оставшийся после выключения вилки, отсутствует.

+4

спасибо! Теперь понимаю. – DDukesterman

4

Изменение:

printf ("print hello"); 
    fork(); 

в

printf ("print hello"); 
    fflush(stdout); 
    fork(); 

По умолчанию stdout обычно линейный буфер. В вашем примере 2) у вас есть гарантия, что stdout сбрасывается до fork, но в примере 1) это может произойти после fork. Промывка stdout до fork гарантирует, что строка будет напечатана до fork.

+2

это действительно не отвечает «почему» – DRC

Смежные вопросы