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

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



題名: [FDclone-users:00148] Re: {FreeBSD,OpenBSD}/sparc64, IA64(AIX 対応その後)
(<03Apr29.133754jst.119044@inetgw.lightwell.co.jp>) において
SHIOTA Shoichi さんがおっしゃるには:
| で、 gdb にだまされていなければ、以下のような動きをしてリソースを
| 食いつぶして落ちているようです。
| 
| 1. 子供が終了する
| 2. trap_chld() で捕獲される
| 3. trap_common() の終わりのほうで、trap_chld() をシグナルハンド
|    ラとして再度セット
| 4. (なぜか) 3 の実行で SIGCHLD が再度やってくる
| 5. 2 からループ
| 
| と、無限の再帰呼び出しとでも言うような状態を起こしているように
| みえます。
| 
| このため以下のように修正を入れてみました。
| 
| --- ここから ---
| $ gdiff -u system.c.org system.c
| --- system.c.org        2003-04-15 00:00:00.000000000 +0900
| +++ system.c    2003-04-29 12:54:45.000000000 +0900
| @@ -2051,7 +2051,13 @@
| 
|         if (trapped < 0) Xexit2(sig + 128);
| 
| -       if (signallist[i].func) signal(sig, (sigcst_t)(signallist[i].func));
| +       if (signallist[i].func)
| +#ifdef SIGCHLD
| +               if (sig != SIGCHLD)
| +                       signal(sig, (sigcst_t)(signallist[i].func));
| +#else
| +               signal(sig, (sigcst_t)(signallist[i].func));
| +#endif
|         errno = duperrno;
|         return(trapped);
|  }
| --- ここまで ---

  手元の AIX 4.1.5.0 でもこの修正↑で正常動作するようになりました。

  それで、

| 1. 子供が終了する
| 2. trap_chld() で捕獲される
| 3. trap_common() の終わりのほうで、trap_chld() をシグナルハンド
|    ラとして再度セット
| 4. (なぜか) 3 の実行で SIGCHLD が再度やってくる
| 5. 2 からループ

  これなのですが、Stevens の「詳解UNIXプログラミング」の 10.7 項
  「SIGCLD の意味」で説明されている話だったりしないでしょうか?

<http://www.amazon.co.jp/exec/obidos/ASIN/4894713195>

> 2. SIGCLD の動作として捕捉を設定した場合、wait の対象となる子プ
> ロセスがあるかどうかをカーネルが直ちに検査し、もしあれば SIGCLD
> ハンドラを呼び出す。
……
> シグナルハンドラの先頭で signal を呼ぶと、前に議論した第 2 項が
> 適用される。カーネルは wait すべき子があるかどうかを検査し、(プ
> ロセスでは SIGCLD を処理しているので、当然そのような子があり) 
> 同じシグナルハンドラを再度呼び出す。シグナルハンドラは signal を
> 呼び出すので、同じ手順が繰り返される。
……
> POSIX.1 には、SIGCHLD に対するシグナルハンドラを設定したときに、
> wait すべき終了した子が存在する場合にシグナルが生成されるかどう
> かの記載がない。これは、上述の動作を許す。しかし、POSIX.1 では、
> シグナルが発生してもそのシグナルに対する動作をデフォルトに戻さな
> い (POSIX.1 の sigaction 関数を使って動作を設定したと仮定する)
> ので、ハンドラ内で SIGCHLD のシグナルハンドラを設定する必要はな
> い。

  AIX 4.1.5 の sys/signal.h ではこうなっています:

#define SIGCLD  SIGCHLD /* old death of child signal */

----
// 木下是雄「理科系の作文技術」中公新書 624 を読もう!!

小島 肇 - KOJIMA Hajime
[Office] kjm@rins.ryukoku.ac.jp, http://www.st.ryukoku.ac.jp/~kjm/
         Phone: 077-543-7414  Fax: 077-543-0706