在Linux中,当子进程退出且父进程未被阻止时,如何使父进程调用等待?
下面是一个示例,waitpid系统调用将阻止父进程,直到子进程退出:在Linux中,当子进程退出且父进程未被阻止时,如何使父进程调用等待?,linux,process,signals,Linux,Process,Signals,下面是一个示例,waitpid系统调用将阻止父进程,直到子进程退出: pid_t pid = fork(); if (pid < 0) { printf("error\n"); return -1; } else if (pid == 0) { printf("child\n"); do_sonmething_in_child(); } else { int status;
pid_t pid = fork();
if (pid < 0) {
printf("error\n");
return -1;
} else if (pid == 0) {
printf("child\n");
do_sonmething_in_child();
} else {
int status;
waitpid(pid, &status, 0);
printf("waitpid returned,do something else\n");
do_something_else();
}
pid_t pid=fork();
if(pid<0){
printf(“错误\n”);
返回-1;
}否则如果(pid==0){
printf(“child\n”);
在孩子身上做什么;
}否则{
智力状态;
waitpid(pid和status,0);
printf(“waitpid返回,执行其他操作\n”);
做点别的事吧;
}
我想实现的是父进程不会被阻止,这可以通过使用信号来实现,所以我更改了代码:
void handler(int n) {
printf("handler %d\n", n);
int status;
wait(&status);
}
pid_t pid = fork();
if (pid < 0) {
printf("error\n");
return -1;
} else if (pid == 0) {
printf("child\n");
do_sonmething_in_child();
} else {
int status;
signal(SIGCHLD, handler);
do_something_else();
}
void处理程序(int n){
printf(“处理程序%d\n”,n);
智力状态;
等待(&状态);
}
pid_t pid=fork();
if(pid<0){
printf(“错误\n”);
返回-1;
}否则如果(pid==0){
printf(“child\n”);
在孩子身上做什么;
}否则{
智力状态;
信号(SIGCHLD,处理器);
做点别的事吧;
}
但是另一个问题来了,如果孩子在信号(SIGCHLD,handler)之前退出,孩子将是一个僵尸,我们不能期望孩子在调用信号(SIGCHLD,handler)之后退出,那么,如何解决我的问题呢?可以在fork()调用之前设置信号处理程序 嗨,聪,我不明白你说“如果孩子存在,它将是一个僵尸”。怎么样?如果它关闭/死亡,它是如何标记为僵尸的?因为它的父级没有调用等待系统调用,执行等待允许系统释放与子级相关的资源,如果没有执行等待,则终止的子级仍处于“僵尸”状态子进程会以这种方式继承信号处理程序吗?我试图避免这种混乱的情况,所以我不会在fork()调用之前设置信号处理程序。它会,但您可以在子进程中更改它。