在我正在开发的 shell 中,我执行一组命令 A |乙 | C
通过派生子进程来执行管道中的每个子进程。这 3 个 child 都具有与第一个 child 相同的 PGID。也就是说,PID x、y、z 的 3 个 child 的 PGID = x。所有 3 个命令的执行都运行完美。在 SIGCHLD 信号处理程序 sigchld_handler()
中,我等待计算终止的子进程数,一旦它为 3,我就获取 PGID 以获取要从 JobList
中删除的作业数据.但是,函数 getpgid()
为所有 3 个 PID x, y, z
返回 -1
。即 getpgid(x)、getpgid(y)、getpgid(z)
都返回 -1
,错误号为 3 (ESRCH)。
在父进程中使用 setpgid()
为子进程设置 pgid 时,getpgid()
运行良好并返回 x。此问题仅发生在信号处理程序中。你能指导我在信号处理程序中获取 pid
的 pgid
吗?
这是信号处理代码:
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
非常感谢任何帮助。
谢谢。
最佳答案
SIGCHLD 是您在子进程终止时收到的信号。这有点道理,你不能为一个死进程请求 PGID ...
请注意,您仅在使用 waitpid
收割进程后才运行它,因此系统无法找到请求的 PID 以从中提取 PGID。
您得到的错误 (3) 是 ESRCH:
#define ESRCH 3 /* No such process */
这只会加强这一点——PID 不再有效。 我建议您创建一个从 PID 到 GID 的内部映射,并在您的流程内部进行查找。
关于c - 无法为 sigchld_handler 中的 pid 获取 pgid(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47109292/