为什么我的程序有很多分叉不停?

时间:2014-09-05 07:41:59

标签: fork

以下下面有许多分叉的程序没有完成

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

1 个答案:

答案 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轻松验证。