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

标签 c linux shell sigchld

在我正在开发的 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/

相关文章:

c - 如何设置gcc -E深度(预处理级别)?

c - VirtualBox 中 linux 上的串行端口从数据流中过滤掉 0x11

c - 格式 ‘%ld’ 需要类型 ‘long int’ ,但参数 3 的类型为 "TEST"

linux - 遍历进程树

linux - 通过网络优化 SCP

c - K&R 1.5.4 C 中的字数统计

linux - 在/var/www/html/上使用 git 存储库

php - 在 Crontab 中获取包含 jQuery 帖子的网页

php - 如何在AWS上将PHP脚本作为后台服务运行?

json - 使用 shell 脚本在特定数组索引后附加 JSON 文件