【发布时间】:2016-04-07 19:35:35
【问题描述】:
我对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”的每个程序。另一方面,如果我将 man 替换为 say "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;
}
【问题讨论】:
-
你在什么操作系统上运行这个?
-
我使用的是 Ubuntu 14.04
-
您正在创建自己的外壳吗?我不知道进程组的确切用途,但在
setpgid()手册页中,shell 似乎使用它们来重新组合同一作业的进程,所以除非你是,否则尝试覆盖它可能是个坏主意写一个shell。 -
是的,我正在用管道编写 shell。我需要进程组向管道中的所有程序发送信号。
-
你能用 C 编译器编译它吗? (
if条件中的声明)
标签: c linux posix wait waitpid