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

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



 しらいです。

In Message-Id <03Apr30.145723jst.119044@inetgw.lightwell.co.jp>
        SHIOTA Shoichi <Shoichi.Shiota@lightwell.co.jp>さんwrites:
> 潮田@今日もお遊びで出社中です。

> >  trap_common() は shell の基本機能として重要な部分ではない
> > ので、中身をそっくり削除してしまっても大勢に影響はありません。
> > なので、system() 以外の行を削除してみて症状が再現するかどう
> > か試してみて下さい。
> この流れでいくと system() は signal() の typo ですよね。

 s/system/signal/ です。system は filename でしたね。なんか
ごっちゃになってしまってすみません。


> trap_common() の
> 	flags = signallist[i].flags;
> から
> 	if (trapped < 0) Xexit2(sig + 128);
> までを削除して試しました。
> 削除前同様の暴走でした。

 では本当に signal() の中に SIGCHLD の発生原因があるんでし
ょうか?libc の source があればいいんでしょうけど、AIX って
売り物なので source は見られませんよねー。


> >  portability を考えるとこの signal() は外せないのですが、も
> > し本当に signal() が SIGCHLD を発生させているのだとしたら、
> > sigaction() に置換えてみましょうか。

> これは、暴走しませんでした。
> 今日たまたまきている者に AIX 4.3.3 をかりて試しましたが、
> そちらでも暴走することなく終了しました。

 となるとやはり signal() の実装ミスかなんかでしょうか?この
置換えでは sa_flags を全く指定していないので、SA_RESTART 辺
りを指定してみると何か起こるかも知れませんね。
 2.03b では一応 sigaction() を使って signal() を実装してお
きますので、release されたら試してみて下さい。
 返り値を必要とするケースのために sigaction() の第三引数を
使っていますが、それ以外は先の置換えと同じ実装にしてあるので、
これで AIX でも動くようになるんじゃないでしょうか。


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

 明示的に SIGCHLD に対して何かを指示しなくても、fork() 前後
の作法として AIX 特有の決めごとがあるのかも知れませんね。何
か man page には載っていませんでした?
 signal() のような基本的関数で実装ミスがあるとは考えにくい
ので、何か作法を間違えてしまっているのではないかと気になって
います。


> で、そういえばと思い出したものがあります。
> 去年入社の新人が秋頃に AIX でだけ暴走しますと言ってきた
> プログラムがありました。

 IBM との保守契約はどうなっています?source を添付して問い
合わせてみると、実は library の bug だったなんてオチが出てく
るかも。


> が、 Tru64 上では、
> -bash-2.05b$ ./a.out
> Hello[1]!! pid(pid=234322)
> Hello[2]!! pid(pid=234322)
> Hello[3]!! pid(pid=234322)
> Hello[4]!! pid(pid=234322)
> Hello[5]!! pid(pid=234322)
> Hello[6]!! pid(pid=234322)
> Hello[7]!! pid(pid=234322)
> Hello[8]!! pid(pid=234322)
> Hello[9]!! pid(pid=234322)
> -bash-2.05b$
> と 10 番目が出力されません。

 fork() 後の親と子はどちらが先に処理されるか決まっていませ
んので、単なるタイミングの問題かも知れません。親側のみもしく
は子側のみに sleep() を噛ませてやると順序が一意に定まります
から、それで期待した結果が得られるかも知れませんよ。
 wait() の代わりに waitpid() を用いて明示的に待つ対象の子を
指定しておくと、よりはっきりすると思います。


> (この ExitChild() は、日中に毎日一万回以上よばれているんですけれ
> ど、なぜ動いているのだろう)

 -DNOJOB で作った fdsh では確か支障無かったんですよね?だか
ら多分 fork() 前後のなにがしかの処理が問題になっているんだと
は思っているのですが。
 その辺りの作法をしっかりしておけば、AIX でも signal() で支
障を来たさないんだと思います。

                                               しらい たかし