1

在我正在开发的 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)全部返回-1errno 3 (ESRCH)。

在将 pgid 设置为setpgid()在父进程中使用的子进程时,getpgid()工作得非常好并返回 x。此问题仅发生在信号处理程序中。你能指导我在信号处理程序中获取pgidpid

这是信号处理程序代码:

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

任何帮助是极大的赞赏。

谢谢。

4

1 回答 1

2

SIGCHLD 是您在子进程终止时收到的信号。这是有道理的,您将无法为死进程请求 PGID...请注意,您仅在已经使用 获得进程后才运行它waitpid,因此系统无法找到请求的 PID 以从中提取 PGID它。

您得到的错误 (3) 是 ESRCH:

#define ESRCH        3  /* No such process */

这只会加强这一点 - PID 不再有效。我建议您创建一个从 PID 到 GID 的内部映射,并在您的进程中进行内部查找。

于 2017-11-04T10:51:35.507 回答