等待未知的子进程

  • 本文关键字:子进程 未知 等待 c
  • 更新时间 :
  • 英文 :


我需要执行n个子进程,n是程序的一个参数,这n个子进程将分别执行一个Linux命令,当它们结束程序时,需要创建另一个子进程来替换它。

问题是,我真的不知道如何等待一个未知的过程。由于每个子进程可以有不同的命令,这些命令可以持续不同的时间,因此主进程需要能够检测其中一个子进程何时结束,并在其位置创建另一个子进程。

我尝试使用一个包含所有pid的n大小的pid_t数组的for循环,但它不起作用。我也尝试过使用wait,但一旦子进程完成,程序就会停止。这就是我所拥有的:

int main(int argc, char *argv[]){
int opt;
int num_procesos=1;
int status;
pid_t pid;

if(argc > 3){
error(argv[0],EXIT_FAILURE);
}
while((opt = getopt(argc,argv,"p")) != -1){
switch(opt){
case 'p':
if(argv[2]==NULL){
error(argv[0],EXIT_FAILURE);
}
num_procesos = atoi(argv[2]);
if(num_procesos < 1 || num_procesos > 8){
fprintf(stderr,"Error: el número de procesos en ejecución tiene que estar entre 1 y 8.");
error(argv[0],EXIT_FAILURE);
}
break;
default:
num_procesos = 1;
break;
}
}

pid_t pids[num_procesos];
for(int i=0;i<num_procesos;i++){
switch(pid = fork()){
case -1:
perror("fork()");
exit(EXIT_FAILURE);
break;
case 0:
leer_y_ejecutar();
}
}

int j=0;

while(j==0){
for(int i=0;i<num_procesos;i++){
if(wait(&status)==0){
switch(pid = fork()){
case -1:
perror("fork()");
exit(EXIT_FAILURE);
break;
case 0:
leer_y_ejecutar();
}
}else{
perror("wait()");
exit(EXIT_FAILURE);
}
}
}
return EXIT_SUCCESS;
}

不要介意函数leer_y_ejecutar(),它只是我代码其余部分的一部分。如果需要任何测试,可以用printf或其他东西代替。

来自wait(2)手册:

wait((系统调用暂停调用线程的执行,直到它的一个子线程终止为止。呼叫等待(&wstatus(相当于waitpid(-1, &wstatus, 0);

waitpid():成功时,返回状态发生变化的子进程的进程ID;如果指定了WNOHANG,并且存在由pid指定的一个或多个子(ren(,但尚未更改状态,则返回0。出现错误时,返回-1。\

waitpid的签名是pid_t waitpid(pid_t pid, int *wstatus, int options);,所以本质上,这段代码:

while(j==0){
for(int i=0;i<num_procesos;i++){
// from here
if(wait(&status)==0){
switch(pid = fork()){
case -1:
perror("fork()");
exit(EXIT_FAILURE);
break;
case 0:
leer_y_ejecutar();
}
// to here
}else{
perror("wait()");
exit(EXIT_FAILURE);
}
}
}

从不读取,因为wait(&status) == 0无法发生,因为尚未指定WNOHANG
作为一种潜在的解决方案,我建议将其更改为wait(&status) > 0

最新更新