[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[FDclone-users:00156] Re: {FreeBSD,OpenBSD}/sparc64, IA64(AIX 対応その後)
- Subject: [FDclone-users:00156] Re: {FreeBSD,OpenBSD}/sparc64, IA64(AIX 対応その後)
- From: Takashi SHIRAI <shirai@unixusers.net>
- Date: Mon, 05 May 2003 21:29:10 +0900
しらいです。
In Message-Id <03May5.173954jst.119047@inetgw.lightwell.co.jp>
SHIOTA Shoichi <Shoichi.Shiota@lightwell.co.jp>さんwrites:
> 潮田です。
> 見てみました。
> $ ./a.out
> 2
> で、これは
> #define SA_RESETHAND 0x00000002 /* signal disposition will be set to
> * SIG_DFL on entry to signal handler */
> でした。
そもそも handler 内で signal() を実行する必要があるのは、
SA_RESETHAND な実装になっている signal() 用の TIPS で、この
流儀は SystemV 系のものですから AIX もそれに倣っているんでし
ょうね。
> > 普通は SA_RESTART くらいしか有効にしないと思います。
> FreeBSD では、この値みたいですね。
SA_RESTART な signal() は BSD 系の流儀なので、4.3BSD 以前
のものも含めて BSD 系では大概そうなっている筈です。
但し、FDclone では EINTR を見るべき箇所ではちゃんと見てい
るので、SA_RESTART は無くても特に支障ないんじゃないかと思っ
ています。足りないところが残っている可能性は否めませんけど。
> 無限ループの原因は明確になりましたが、疑問点も出てきました。
> そもそも、 SA_RESETHAND ってそんな現象を起こすもの?
> SA_RESETHAND の説明を読んでもそんな現象を起こしかねない危険性が
> あるとは、私には読み取れないもので。
SA_RESETHAND による handler 再設定をどのタイミングで行なお
うとしているかによっては、handler 内で SA_RESETHAND 付の再設
定を行なうのはまずいかも知れませんね。
でも、PISIX より前の SystemV では、handler 処置で signal()
による再設定を行なうのは定石だった筈で、そういう定石を実装し
て無限ループになってはまずいと思います。
と思って FDclone の source を良く見てみると、定石的にはも
う一つやらなくてはならない signal() が欠けていますね。handler
の先頭で SIG_IGN していません。
POSIX 的には signal handler 実行中に再度同じ signal が発生
しても、handler 終了まで block されているというのが signal()
の標準設定の筈ですけど、SystemV 的には handler の先頭で明示
的に SIG_IGN する必要があったような気がします。
試しに trap_common() の先頭に signal(sig, SIG_IGN) してみ
るとどうなるでしょう?もしこれで無限ループが止まるようなら、
旧式の OS での実装を考えるとこちらの対処の方が正しい気がしま
す。
> SA_NOCLDSTOP もともにつけるのがカギかと思ったのですが、
> 甘すぎでした。
SA_NOCLDSTOP は set -b した shell 環境で suspend 報告があ
るか否かの違いにしかならないと思いますので、これはこの際どち
らでも構わないと思います。
この実装は本家 Bourne shell でも環境に依存していた筈なので、
signal() -> sigaction() になってその依存性を一元化出来るよう
になったからと言って、どちらに統一すべきという指針は特に存在
しないんじゃないでしょうか。
実用上何らかの不都合があるようであれば、SA_NOCLDSTOP の有
無に配慮した実装にしても構いませんけど。
しらい たかし