为什么我的许多叉子程序不停止?
问题描述:
该程序有很多叉如下没有完成。为什么我的许多叉子程序不停止?
#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
...
答
其实这个程序并没有等待任何东西。这里发生的是你创建的子进程,从你当前的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
验证。