[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[FDclone-users:00155] Re: {FreeBSD,OpenBSD}/sparc64, IA64(AIX 対応その後)
- Subject: [FDclone-users:00155] Re: {FreeBSD,OpenBSD}/sparc64, IA64(AIX 対応その後)
- From: SHIOTA Shoichi <Shoichi.Shiota@lightwell.co.jp>
- Date: Mon, 05 May 2003 17:39:53 +0900
潮田です。
Takashi SHIRAI <shirai@unixusers.net> wrote:
> もしなにがしかの結果が得られたようなら教えて下さい。AIX 独
> 自の作法があるようなら、今後の参考にしないといけませんし。
返事がきましたらお知らせします。
> 以下の source を compile すると、signal() が標準的に有効に
> する sa_flags の値が判ります。この値を <signal.h> と見比べて、
> SA_... のうちどれが有効になっているのか調べてみて貰えません
> か?
見てみました。
$ ./a.out
2
で、これは
#define SA_RESETHAND 0x00000002 /* signal disposition will be set to
* SIG_DFL on entry to signal handler */
でした。
> 普通は SA_RESTART くらいしか有効にしないと思います。
FreeBSD では、この値みたいですね。
別の OS については、下のほうで。
> ここで signal() の標準的な flag 値が判ったら、先に示してあ
> る signal() の置換えで、sa_flags にその値をセットしてみて下
> さい。それで無限ループが再現するようなら、その flag のせいだ
> ということが明確になるでしょう。
で、上の値を act.sa_flags にセットすると見事に無限ループが
出来上がりました。
無限ループの原因は明確になりましたが、疑問点も出てきました。
そもそも、 SA_RESETHAND ってそんな現象を起こすもの?
SA_RESETHAND の説明を読んでもそんな現象を起こしかねない危険性が
あるとは、私には読み取れないもので。
で、実験してみました。
(いつも同じではなんですので、環境を変えています)
1)
SunOS 5.7
$ ./a.out
20012
#define SA_NOCLDSTOP 0x00020000
#define SA_RESETHAND 0x00000002
#define SA_NODEFER 0x00000010
sa_flags = SA_RESETHAND にしても、動作かわらず。
(無限ループなどは起こらない)
2)
HP-UX B.11.00
$ ./a.out
c
#define SA_NOCLDSTOP 0x00000008
#define SA_RESETHAND 0x00000004
sa_flags = SA_RESETHAND にすると、見事に無限ループ。
Pid XXXX received a SIGSEGV for stack growth failure.
Possible causes: insufficient memory or swap space,
or stack size exceeded maxssiz.
Memory fault(coredump)
と落っこちました。
ものはためしということで AIX 上でも
sa_flags を上記の solaris やら HP-UX と同じフラグで試しましたが
無限ループで変わりませんでした。
SA_NOCLDSTOP もともにつけるのがカギかと思ったのですが、
甘すぎでした。