2011-10-08 94 views
3
main() { 
    fork(); 
    fork(); 
    printf("Hello world\n"); 
} 

在上述程序中,父进程生成子进程。孩子的过程反过来产生一个孙子过程。执行这个程序后,我得到以下输出。unix中的多个叉子

Macintosh:unix NightFury$ ./a.out 
Hello world 
Hello world 
Hello world 
Macintosh:unix NightFury$ Hello world 

为什么不输出来作为一个单一的过程输出?是的,应该打印4个“你好世界”,但为什么最后一个作为单独的过程打印?

+0

尝试'./a.out> result.txt'并检查文本文件的内容。 –

回答

4

shell等待第一个进程结束,然后再次打印shell提示符。您还有三个其他进程在运行,当时有两个进程在shell提示符出现之前写入了输出,一个在后面写入了它的输出。每次运行程序时,事情可能不会按照这个确切的顺序发生 - 有时候您可能会比这个例子晚或晚得到shell提示符。

这是你可以写一个不断在“后台”运行程序。

1

他们实际上都印为一体,但父进程死亡,因此外壳打印出的“Macintosh:UNIX NightFury $”线与最后剩余的子进程后打印其行。 实际上,您应该可以通过添加一行来请求父进程等待每个孩子死亡的行,然后不应该有该行。