私が開発しているシェルでは、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) で返されます。-1
x, y, z
getpgid(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
どんな助けでも大歓迎です。
ありがとう。