2014-09-05 46 views
0

该程序有很多叉如下没有完成为什么我的许多叉子程序不停止?

#include <unistd.h> 
#include <iostream> 

int main() { 
    static int fork_cnt = 0; 
    const unsigned kCnt = 4; 

    for (int i = 0; i < kCnt; ++i) { 
    fork(); 
    } 
    std::cout << "fork_cnt=" << fork_cnt << std::endl; 
    return 0; 
} 

当我跑了它,它停止如下。看来主叉完成了,但其他程序正在等待某些东西。

fork_cnt=0 
[email protected]:~$ fork_cnt=0 
fork_cnt=0 
fork_cnt=0 
fork_cnt=0 
fork_cnt=0 
fork_cnt=0 
fork_cnt=0 
fork_cnt=0 
fork_cnt=0 
fork_cnt=0 
fork_cnt=0 
... 

回答

1

其实这个程序并没有等待任何东西。这里发生的是你创建的子进程,从你当前的stdin分离(至少我相信他们确实给出了他们的行为)。当您的原始过程返回时,sh重新获得对stdin的控制权并提示您输入 - 因此您的第二个列表的第二行中为[email protected]:~$。无论如何,你的子进程继续写入标准输出,因此在[email protected]:~$之后输出fork_cnt=0。当所有进程结束时sh看不到任何理由再次提示您输入,因此在您看来,程序仍在运行,但如果您输入了某个命令(或者只是点击Enter),您就会看到它的确如此。

要测试此操作,请尝试以下操作:在每个子进程创建后立即创建一个无限循环。

#include <unistd.h> 
#include <iostream> 

int main() { 
    static int fork_cnt = 0; 
    const unsigned kCnt = 4; 

    for (int i = 0; i < kCnt; ++i) { 
    int pid = fork(); 
    while(pid == 0); 
    } 
    std::cout << "fork_cnt=" << fork_cnt << std::endl; 
    return 0; 
} 

现在fork_cnt=0输出只有一次,你恢复对终端的控制。

[email protected]:~/Programming/playground/fork# ./a.out 
fork_cnt=0 
[email protected]:~/Programming/playground/fork# 

不管怎样,子进程仍然在运行,你可以很容易地在你的shell进入ps验证。

相关问题