gpt4 book ai didi

c - Waitpid 永远阻塞

转载 作者:太空狗 更新时间:2023-10-29 12:12:46 25 4
gpt4 key购买 nike

我对 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”替换 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;
}

最佳答案

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

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

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

关于c - Waitpid 永远阻塞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36485586/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com