这是我更新的代码段
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循环中购买更多时间,则不会出现此问题。 谁能告诉我这是什么问题?是否有必要在多个货叉之间设置延迟?
谢谢
答案 0 :(得分:1)
我不确定该程序是否符合最初的目的。
基本上
for (i=0 ; i<N ; i++) {
print("Forking\n");
fork();
}
从最后得到N == 30
的推理。
等...
不显示30“分叉”,而是2^0+2^1+2^2+...+2^29
“分叉”。
即。 2^N-1
或2^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);
的代码段中,让孩子死亡(可怕的话)会提供预期的结果。
答案 1 :(得分:1)
如果父进程被杀死,那么孩子也将被杀死。因此,我们需要通知父进程等待孩子完成其工作。在您的计划中使用wait
或waitpid
。
wait
将阻止调用进程,直到其任何一个子进程终止。
waitpid
将阻止调用进程,直到第一个agrument中提到的子进程终止。
答案 2 :(得分:0)
在父母去世之前,某些子进程可能没有时间打印。
在结束父进程之前,您需要wait
查看子进程。
也可能存在多个子进程同时写入同一输出流的问题。 (任何人都可以验证这是一个潜在的问题吗?)