1

私が開発しているシェルでは、A | B | C子をフォークしてパイプ内の各子を実行することにより、一連のコマンドを実行します。3 つの子はすべて、最初の子と同じ PGID を持っています。つまり、PID x、y、z を持つ 3 つの子は、PGID = x を持ちます。3 つのコマンドすべての実行は完全に実行されます。SIGCHLD シグナル ハンドラーsigchld_handler()で、終了した子の数をカウントするのを待ち、それが 3 になると、PGID を取得して、ジョブ データを から削除しJobListます。ただし、この関数は3 つの PID すべてに対してgetpgid()戻ります。つまり、すべてerrno 3 (ESRCH) で返されます。-1x, y, zgetpgid(x), getpgid(y), getpgid(z)-1

setpgid()親プロセスで使用している子に pgid を設定している間、完全に正常に機能し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

どんな助けでも大歓迎です。

ありがとう。

4

1 に答える 1