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

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



 しらいです。

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

> >  試しに trap_common() の先頭に signal(sig, SIG_IGN) してみ
> > るとどうなるでしょう?もしこれで無限ループが止まるようなら、
> > 旧式の OS での実装を考えるとこちらの対処の方が正しい気がしま
> > す。
> 	duperrno = errno;
> の前の行に入れて試してみました。
> あいかわらず、無限ループになりました。

 無限 loop とは別の問題なのですが、この件に対する対処も考え
ています。
 handler 実行中に同じ signal が発生した場合、signal() の実
装により挙動がまちまちなので、sigaction() の使えない環境では
handler 先頭で signal を block しておくくらいしか手がありま
せん。
 厳密にはその block が有効になるまでの一瞬に signal が発生
すると回避不能なのですが、旧式の signal() の実装ではこれをど
う回避すべきなのか、私が調べた限りでは正解が見つかりませんで
した。

# そもそも handler 内で trap 用実行 command を動かしている
#辺りで十分「間違い」なのは判っているんですけどね。


> そんな高尚な意味ではなく、単に solaris と HP-UX の sa_flags を
> みて、SA_RESETHAND と SA_NOCLDSTOP はペアでセットするのが
> SYSV のお作法なのかと(私が)思っただけのことです。

 SVR3 の signal() の実装が SA_RESETHAND | SA_NOCLDSTOP だっ
たというだけなんだと思います。SVR2 辺りだと SA_NODEFER も付
いてるかも知れません。


> 今、 Tru64 でも試してみたのですが、これはなんと
> $ ./a.out
> 0
> でした。
> うーん、源流が見えない OS 。

 OSF/1 のなれの果てですから、SVR4 の一派になるかとは思いま
すけど、昔の実装は BSD 的なところが多かったので、signal() の
ような obsolete な関数の実装はどこを引き継いだらいいものやら
悩んでいるんじゃないでしょうか。
 多分、互換性を考えると BSD 風味の残っていた V2 時代の実装
を模しているんだと思います。

                                               しらい たかし