2013-01-15 27 views
1

这是我更新的代码段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子进程正常工作。但是对于某些进程,子代码根本不被执行,子进程只是挂起。 (我,E叉()只返回子ID,但不是零)。 如果我通过调用其他虚拟函数在for循环中购买更多时间,则不会看到此问题。 谁能告诉我最新的问题?是否有必要延迟多叉?

谢谢

+4

该错误代码未显示,很可能是您在'case 0'中调用的函数(例如,如果它不调用'_exit',那可能是您的问题)。给我们一个完整的,可编译的,自包含的例子来证明问题。 –

+0

如果'some function'中的代码返回,那么这不是一个[fork bomb](http://en.wikipedia.org/wiki/Fork_bomb)? – unwind

+0

我忘了在这里提到_exit(0)。它在我的实际代码中。仍然有1或2个进程没有命中子代码,但父进程被执行。 –

回答

0

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

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

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

+0

但是,在childs部分,我正在调用一个没有被执行的函数。 (正如我所提到的,对于所有的子进程都没有看到这种行为,只有1或2个进程挂起) –

+0

在这种情况下,它将取决于函数在做什么。对fork()可以被调用的频率没有限制。 –

1

我不确定该程序做它最初打算做什么。

基本上具有N == 30从端

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

推理。

  • 对我== 29:在孩子结束循环和模具
  • 对我== 28:在仍然做和这样做的孩子 ...

等等

而不是显示30“分岔”,将会有2^0+2^1+2^2+...+2^29“分岔”。

I.e. 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

如果父进程被杀死,那么子进程也会被杀死。所以我们需要通知父母程序等到孩子完成工作。在您的程序中使用waitwaitpid

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

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

+0

是的。我在for循环之后做了waitpid。 –