当子进程数量很大时,我的程序停止运行。我不知道问题是什么,但我猜子进程在运行时以某种方式被阻止。
下面是该程序的主要工作流程:
void function(int process_num){
int i;
// initial variables for fork()
int status = 0;
pid_t child_pid[process_num], wpid;
int *fds = malloc(sizeof(int) * process_num * 2);
// initial pipes
for(i=0; i<process_num; i++){
if(pipe(fds + i*2) <0)
exit(0);
}
// start child processes to write
for(i=0; i<process_num; i++){
child_pid[i] =fork();
if(child_pid[i] == 0){
close(fds[i*2]);
// do something ...
// write(fds[i*2+1], something);
close(fds[i*2+1]);
exit(0);
}else if(child_pid[i] == -1){
printf("fork error\n");
exit(0);
}
}
// parent waits child processes and reads
for(i=0; i<process_num; i++){
pid_t cpid = waitpid(child_pid[i], &status, 0);
if (WIFEXITED(status)){
close(fds[i*2+1]);
// do something ...
// read(fds[i*2], something);
close(fds[i*2]);
}
}
free(fds);
while((wpid = wait(&status)) > 0);
}
我通过 htop 检查了进程的状态,有几个(例如 8 个,而 process_num 为 110)子进程留下了状态S
.
现在我的问题是:如果子进程的数量大于处理器的数量,在使用子进程和当前进程的管道进行通信时,子进程是否会被阻塞(父进程等待所有子进程执行)?多谢!
EDIT:我在使用时打印了fds的Idread()
and write()
,我发现读取从 4 开始,写入从 5 开始,我不知道为什么会这样,有人知道吗?
处理器的数量在这里没有影响。操作系统是活的,能够运行任何有事可做的进程。
这是一个纯软件问题,所有进程都处于睡眠状态(S),等待某个从未发生的事件。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)