在背景中分叉不要正常工作

时间:2017-08-28 09:58:32

标签: c linux

我运行这个编程。在前景和背景中:

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    
...

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

1 个答案:

答案 0 :(得分:4)

这与输出缓冲区有关:新创建的进程正在遍历其父已print编辑的内容。请注意,消息不会改变,即:它总是App Start pid=1368!

在第一次调用fflush(stdout)后放置printf()

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

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

请注意,默认情况下,通过启动fork程序而不重定向stdout(即:$ ./fork),stdout 行缓冲。因此,每次收到换行符时,都会执行stdout的刷新。