以下下面有许多分叉的程序没有完成。
#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
qingfeng@ubuntu:~$ 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
...
答案 0 :(得分:1)
实际上程序并没有等待任何事情。这里发生的是你创建子进程,从你当前的stdin中分离出来(至少我相信他们确实给出了他们的行为)。当原始进程返回时,sh重新获得对stdin的控制并提示您输入 - 因此在第二个列表的第二行中qingfeng@ubuntu:~$
。无论如何,您的子进程继续写入stdout,因此在fork_cnt=0
之后输出qingfeng@ubuntu:~$
。当所有进程都结束时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
仅输出一次,您将重新获得对终端的控制权。
paul@www:~/Programming/playground/fork# ./a.out
fork_cnt=0
paul@www:~/Programming/playground/fork#
无论如何,子进程仍在运行,您可以通过在shell中输入ps
轻松验证。