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

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



潮田です。

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 もともにつけるのがカギかと思ったのですが、
甘すぎでした。