【问题标题】:How to make parent process invoke wait when child exits with parent unblocked in Linux?当子退出时父进程在Linux中解除阻塞时,如何使父进程调用等待?
【发布时间】:2017-10-07 08:35:51
【问题描述】:

这里是一个例子,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();
    }

我想要实现的是父进程不会被阻塞,这可以通过使用信号来完成,所以我改变了我的代码:

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();
}

但是另一个问题来了,如果子在signal(SIGCHLD, handler)之前退出,子将是僵尸,我们不能指望子在之后退出>signal(SIGCHLD, handler)被调用了,请问我的问题怎么解决?

【问题讨论】:

  • 嗨聪,我不明白你说“如果孩子存在,那就是僵尸”。如何?如果它关闭/死亡,它如何被标记为僵尸?
  • 因为他的父级没有调用等待系统调用,执行等待可以让系统释放与子级关联的资源,如果没有执行等待,则终止的子级仍然处于“僵尸”状态状态。

标签: linux process signals


【解决方案1】:

您可以在 fork() 调用之前设置信号处理程序。

【讨论】:

  • 子进程会以这种方式继承信号处理程序吗?我试图避免这种混乱的情况,所以我没有在 fork() 调用之前设置信号处理程序。
  • 它会,但您可以随时在子进程中更改它。
猜你喜欢
  • 2010-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-05
  • 2013-08-01
  • 1970-01-01
相关资源
最近更新 更多