gpt4 book ai didi

c - 无法为 sigchld_handler 中的 pid 获取 pgid()

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:05:41 24 4
gpt4 key购买 nike

在我正在开发的 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。此问题仅发生在信号处理程序中。你能指导我在信号处理程序中获取 pidpgid 吗?

这是信号处理代码:

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/

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