[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[FDclone-users:00149] Re: {FreeBSD,OpenBSD}/sparc64, IA64(AIX 対応その後)



 しらいです。

In Message-Id <03Apr29.133754jst.119044@inetgw.lightwell.co.jp>
        SHIOTA Shoichi <Shoichi.Shiota@lightwell.co.jp>さんwrites:
> 潮田です。

> 1. 子供が終了する
> 2. trap_chld() で捕獲される
> 3. trap_common() の終わりのほうで、trap_chld() をシグナルハンド
>    ラとして再度セット
> 4. (なぜか) 3 の実行で SIGCHLD が再度やってくる
> 5. 2 からループ

 SIGCHLD は本当に signal() により発生しているんでしょうか?
実は FDclone の signal 処理には結構無茶をやっている箇所があ
って、reentrant でない system call を敢えて使わざるを得ない
局面があるんです。その辺りがネックになっているかも知れません。
 trap_common() は shell の基本機能として重要な部分ではない
ので、中身をそっくり削除してしまっても大勢に影響はありません。
なので、system() 以外の行を削除してみて症状が再現するかどう
か試してみて下さい。

 signal handler の実装は OS により微妙に差異があって、その
中で handler の再設定を行なわないと、次の signal に対する挙
動が既定値に戻ってしまうという実装もあります。
 portability を考えるとこの signal() は外せないのですが、も
し本当に signal() が SIGCHLD を発生させているのだとしたら、
sigaction() に置換えてみましょうか。
 それで直るとしたら、OS 側で用意されている library 実装が原
因ということになるでしょうか。

	if (signallist[i].func) {
		struct sigaction act;

		act.sa_handler = (sigcst_t)(signallist[i].func);
		act.sa_flags = 0;
		sigemptyset(&act.sa_mask);
		sigaction(sig, &act, NULL);
	}


> 私自身、 AIX 上で同じこと(SIGCHLD のハンドラ中で再度 SIGCHLD の
> ハンドラのセット)をしているプログラムを書いていて、それが今も
> 某所で動いています。

 FDclone の中で SIGCHLD を特別扱いしている箇所は 3 箇所だけ
だと思います。
	1. trap_chld() の中で checkjob() を呼んでいる。
	2. makechild() の中で SIGCHLD の mask を外している。
	3. posixsh.c/gettermio() の中で SIGCHLD の block 対
	   象に追加している。
 それぞれ該当箇所は 1 行のみですので、その 1 行を削除してみ
ることで、元のままの trap_common() でも支障なく動作したりす
るようであれば、別のところに原因があるということになりますね。
 一度試してみて下さい。

                                               しらい たかし