fork调用不执行子代码

时间:2013-01-15 10:01:05

标签: c fork

这是我更新的代码段

for (int i=0; i<30; i++){

        printf("Forking\n");

        tmpPid = fork();

        switch(tmpPid)

       {
         case -1:

            printf("Error");
            break;
         case 0:

          printf("Fork success for proc %d\n", i);
          //call some function
           _exit(0)
           break;

         default:

         printf("Fork succeed");
         //store the pid in a vector
          break;
    }
}

//iterate through the vector and wait on each process.
// waitpid(vectorList[i], &exitStatus, WNOHANG)

将近15-18个子进程的分叉工作正常。但是对于某些进程,子代码根本不会执行,而子进程只是挂起。 (i,e fork()只返回子id但不返回零)。 如果我通过调用其他虚拟函数在for循环中购买更多时间,则不会出现此问题。 谁能告诉我这是什么问题?是否有必要在多个货叉之间设置延迟?

谢谢

3 个答案:

答案 0 :(得分:1)

我不确定该程序是否符合最初的目的。

基本上

  for (i=0 ; i<N ; i++) {
      print("Forking\n");
      fork();
  }

从最后得到N == 30的推理。

  • for i == 29: child parent 结束 for 循环并死去
  • for i == 28: parent 仍然要 29 child ...
  • 也是如此

等...

不显示30“分叉”,而是2^0+2^1+2^2+...+2^29“分叉”。

即。 2^N-12^30 - 11,073,741,823分叉。

根据您的操作系统,系统可能会抱怨并挂起达到ulimit / system / window / user / shell限制。

也许

  for (i=0 ; i<N ; i++) {
      print("Forking\n");
      if (fork()) exit(0);
  }

或在default:exit(0);的代码段中,让孩子死亡(可怕的话)会提供预期的结果。

答案 1 :(得分:1)

如果父进程被杀死,那么孩子也将被杀死。因此,我们需要通知父进程等待孩子完成其工作。在您的计划中使用waitwaitpid

wait将阻止调用进程,直到其任何一个子进程终止。

waitpid将阻止调用进程,直到第一个agrument中提到的子进程终止。

答案 2 :(得分:0)

在父母去世之前,某些子进程可能没有时间打印。

在结束父进程之前,您需要wait查看子进程。

也可能存在多个子进程同时写入同一输出流的问题。 (任何人都可以验证这是一个潜在的问题吗?)