Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Linux中,当子进程退出且父进程未被阻止时,如何使父进程调用等待?_Linux_Process_Signals - Fatal编程技术网

在Linux中,当子进程退出且父进程未被阻止时,如何使父进程调用等待?

在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;

下面是一个示例,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;
        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()调用之前设置信号处理程序。它会,但您可以在子进程中更改它。