[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[FDclone-users:00149] Re: {FreeBSD,OpenBSD}/sparc64, IA64(AIX 対応その後)
- Subject: [FDclone-users:00149] Re: {FreeBSD,OpenBSD}/sparc64, IA64(AIX 対応その後)
- From: Takashi SHIRAI <shirai@unixusers.net>
- Date: Tue, 29 Apr 2003 20:34:57 +0900
しらいです。
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() でも支障なく動作したりす
るようであれば、別のところに原因があるということになりますね。
一度試してみて下さい。
しらい たかし