2017-08-28 58 views
3

我运行这个编。在前景和背景:在后台拨叉不工作正确

int main()  
{ 
    int pid; 
    printf("App Start pid=%d!\n",getpid()); 

    while(1) { 
     pid=fork(); 
     if(pid==0) { 
      printf("Child\n\n"); 
      exit(0); 
     } 
     else if(pid>0) { 
      printf("Parent\n"); 
     }  
     sleep(1); 
    } 
} 

前景:

$ ./fork 

结果是:

App Start pid=1360!  
Parent  
Child  
Parent  
Child  
... 

背景:

$./fork > out.txt & 
$cat out.txt  
App Start pid=1368!  
Child  
App Start pid=1368!  
Parent  
Child  
App Start pid=1368!  
Parent  
Parent  
Child  
... 

为什么应用程序 '重启' 在背景? 我不明白发生了什么事。 我如何让叉子在后台应用程序中正常工作? 感谢

+0

缓冲标准输出的另一个好的答案:stackoverflow.com/a/39536803/646887 –

回答

4

这同输出缓冲器做:新创建的进程正在写一遍又一遍什么他们的父母已经print版。请注意,该消息不会更改,即:始终为App Start pid=1368!

广场fflush(stdout)第一次调用printf()后:

printf("App Start pid=%d!\n",getpid()); 
fflush(stdout); 

这样输出缓冲区将是创建子进程之前冲刷


注意,通过启动fork程序而不重定向stdout(即:$ ./fork),stdout行缓冲默认。因此,每当它收到换行符时,已执行冲洗stdout

+0

有趣的。注释“父”被打印的次数增加。 – kabanus

+3

正确的答案,可能需要添加为什么它的工作原理没有重定向...(默认情况下是'stdout'行缓存) –

+0

我明白了,现在可以了.many,非常感谢, – pic32mz