まつもと ゆきひろです

In message "[ruby-list:20727] Re: call Process::waitpid with -1"
    on 00/02/15, Tomoyuki Kosimizu <greentea / fa2.so-net.ne.jp> 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 <sys/types.h>
#include <sys/wait.h>
#include <signal.h>

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だけを作ってデバッグしてます、私は。

                                まつもと ゆきひろ /:|)