1

这是我更新的代码片段

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 个子进程的分叉工作正常。但是对于某些进程,子代码根本没有执行,子进程只是挂起。(即 fork() 仅返回子 ID,但不返回零)。如果我通过调用其他一些虚拟函数在 for 循环中购买更多时间,那么这个问题就不会出现。谁能告诉我什么问题?是否有必要在多个分叉之间设置延迟?

谢谢

4

3 回答 3

1

如果父进程被杀死,那么子进程也将被杀死。所以我们需要通知父进程等到子进程完成它的工作。在您的程序中使用wait或。waitpid

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

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

于 2013-01-15T10:56:27.417 回答
1

我不确定该程序是否完成了它最初打算做的事情。

基本上

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

从头到尾推理N == 30

  • for i == 29:孩子父母结束for循环并死亡
  • 对于 i == 28:父母仍然要做29 ,孩子也是如此......

ETC...

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

2^N-12^30 - 1,或1,073,741,823分叉。

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

也许

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

或者在片段中必须default:exit(0);孩子死去(可怕的话)会提供预期的结果。

于 2013-01-15T10:55:43.467 回答
0

在父进程死亡之前,一些子进程可能没有时间打印。

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

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

于 2013-01-15T10:40:57.900 回答