我对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;
}
答案 0 :(得分:2)
您将子进程放在其自己的进程组中。会话的控制终端在任何给定时间只有一个前台进程组,并且您不会将子进程组放在前台。因此,它不接收键盘输入,并且其标准输出不会显示在终端上。
因为你在孩子中执行的命令等待键盘输入,而该命令在后台时永远不会出现,该命令永远不会退出,waitpid()
永远不会收集它。
除非您有特定的理由将孩子放在不同的过程组中,否则您可能不应该这样做。