Waitpid永远封锁

时间:2016-04-07 19:35:36

标签: c linux posix wait waitpid

我对waitpid功能有点困惑:

int main(int argc, char** argv) {
    if (pid_t pid = fork()) {
        setpgid(pid, pid);
        waitpid(pid, NULL, 0);
    } else {
        setpgid(0, 0);
        char *args[] = {"man", "2", "pipe", NULL};
        execvp(args[0], args);
    }

    return 0;
}

在这个示例程序中只是阻塞而没有任何东西。同样的故事也会随着每一个等待你按下“q”的节目而变得越来越少。另一方面,如果我用说" ls" - 一切都很完美:它打印目录的内容。

char *args[] = {"ls", NULL};

那么男人有什么特别之处呢?

编辑:我忘了说我需要这个过程成为一个团队的领导者。如果我删除setpgid(),一切都还可以:

int main(int argc, char** argv) {
    if (pid_t pid = fork()) {
        waitpid(pid, NULL, 0);
    } else {
        char *args[] = {"man", "2", "pipe", NULL};
        execvp(args[0], args);
    }

    return 0;
}

1 个答案:

答案 0 :(得分:2)

您将子进程放在其自己的进程组中。会话的控制终端在任何给定时间只有一个前台进程组,并且您不会将子进程组放在前台。因此,它不接收键盘输入,并且其标准输出不会显示在终端上。

因为你在孩子中执行的命令等待键盘输入,而该命令在后台时永远不会出现,该命令永远不会退出,waitpid()永远不会收集它。

除非您有特定的理由将孩子放在不同的过程组中,否则您可能不应该这样做。