Waitpid 永远阻塞

Waitpid blocks forever

我对 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' 的 less 和每个程序上。另一方面,如果我用 "ls" 替换 man - 一切正常:它打印目录的内容。

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

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

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

除非您有特殊原因将子进程放在不同的进程组中,否则您可能不应该这样做。