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

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



潮田です。

KOJIMA Hajime / 小島肇 <kjm@rins.ryukoku.ac.jp> wrote:

> | このため以下のように修正を入れてみました。
>   手元の AIX 4.1.5.0 でもこの修正↑で正常動作するようになりました。
そうですか、そのころから既にこういう動作なのですね。

> > POSIX.1 には、SIGCHLD に対するシグナルハンドラを設定したときに、
> > wait すべき終了した子が存在する場合にシグナルが生成されるかどう
> > かの記載がない。これは、上述の動作を許す。しかし、POSIX.1 では、
> > シグナルが発生してもそのシグナルに対する動作をデフォルトに戻さな
> > い (POSIX.1 の sigaction 関数を使って動作を設定したと仮定する)
> > ので、ハンドラ内で SIGCHLD のシグナルハンドラを設定する必要はな
> > い。
これは、
「POSIX.1 では、ハンドラ内で SIGCHLD のシグナルハンドラを設定する
 必要はない。
 しかし、 POSIX.1  では、動作が・・・(上述)のような実装を許容して
 おり、この場合はハンドラ内で SIGCHLD のシグナルハンドラを設定
 してはいけない。」
ぐらいに解するのでしょうか。

> if (sig != SIGCHLD)
>      signal(sig, (sigcst_t)(signallist[i].func));
これでも、2度目以降の子供の終了時に trap_chld() へ飛んで
きますから、再度のセットが必要ないのは確かでしょうが、
なんだかなーって感じですね。
# [FDclone-user:00157] で使用したソースで試してしまい、
# ./fdsh: No child processes
# なんて表示されたときには、びっくりしました。
# signal(sig, SIG_IGN);
# を頭に入れていたのを忘れてました。

SIGCHLD だけ、特別扱いでも良いのでしょうが、やはり sigaction() 
への書き換えですかね。
SIG_DFL に戻らないシグナルは SIGCHLD だけではないですし。
現在直接の原因は signal(SIGCHLD, ) が SA_RESETHAND をセットして
しまうことだと [FDclone-user:00155] で分かっていますが、
これは、 SA_RESETHAND (のみ)をセットすること自体が問題なのか、
この値のときに、ああいった動作をすることが問題なのかも、私には
判断がつけられません。


あと、他の部門で AIX 4.3.3 を借りてテストしました。
5.1.0 と同じでした。
# 5.1.0 のサポートが 2004/04/30 までと聞かされてちょっとショック