From: matz@... (Yukihiro Matsumoto) Date: 2000-02-15T22:33:41+09:00 Subject: [ruby-list:20739] Re: call Process::waitpid with -1 まつもと ゆきひろです In message "[ruby-list:20727] Re: call Process::waitpid with -1" on 00/02/15, Tomoyuki Kosimizu writes: |越水です。 | |いただいたパッチを当ててもダメでした。;_; | |次のコードで試しているのですが: | |trap('CHLD') { | while (pid = Process.waitpid(-1, Process::WNOHANG)) | p pid | end |} | |if not fork | sleep 1 | exit |else | sleep 10 |end | |次のように、waitpidが2回呼び出されているようです: 2回って while でループ回してるんだから複数回呼ばれるのは当然 では? WNOHANGで子どもがいなければ本来waitpidは0を返すはずで すから、いつも真ですし。 # nilの方が良い? 問題なのはlinuxではWNOHANGを指定していても0でなく-1を返すこ とです。以下のC版でも同じ状況が発生しました。これ問題じゃな いのかなあ。 #include #include #include static void waitsig() { int pid; while (pid = waitpid(-1, 0, WNOHANG)) { printf("%d\n", pid); if (pid < 0) { perror("waitpid"); exit(1); } } } main() { signal(SIGCHLD, waitsig); if (fork() == 0) { sleep(1); exit(0); } else { sleep(10); } } しかし、カーネルソース(kernel/exit.c)を読む限りではWNOHANGに 対応しているようです。だれが悪さをしているんでしょう? libc? |ところで、process.cのソースをいじってprintfデバッグやろうとしたのです |が、makeで失敗したり、ext/をmakeしている途中で埋め込んだprintfが実行さ |れたりとサンザンな目にあいました(^^; 。 そういう時にはminirubyだけを作ってデバッグしてます、私は。 まつもと ゆきひろ /:|)