在我正在开发的 shell 中,我A | B | C
通过派生子来执行管道中的每个子来执行一组命令。这 3 个孩子的 PGID 都与第一个孩子的 PGID 相同。即 PID x, y, z 的 3 个孩子的 PGID = x。所有 3 个命令的执行运行完美。在 SIGCHLD 信号处理程序sigchld_handler()
中,我等待计算终止的子项数量,一旦为 3,我获取 PGID 以获取要从JobList
. 但是,该函数getpgid()
返回-1
所有 3 个 PID x, y, z
。即getpgid(x), getpgid(y), getpgid(z)
全部返回-1
errno 3 (ESRCH)。
在将 pgid 设置为setpgid()
在父进程中使用的子进程时,getpgid()
工作得非常好并返回 x。此问题仅发生在信号处理程序中。你能指导我在信号处理程序中获取pgid
吗pid
?
这是信号处理程序代码:
void sigchld_handler(int s) {
\\declarations
pid_t pid, pgid;
.
.
.
while ((pid = waitpid(-1, &status, WNOHANG | WUNTRACED)) > 0) {
pgid = getpgid(pid); // pgid = -1, but should return x.
.
.
.
}
}
而在main()
,在父进程中,在我这样做之后:
.
.
setpgid(x, x);
setpgid(y, x);
setpgid(z, x);
.
.
getpgid(x) returns x
getpgid(y) returns x
getpgid(z) returns x
任何帮助是极大的赞赏。
谢谢。