1

次のような SIGCHLD ハンドラの例がいくつかあります。

void child()                                                                                                                  
{                                                                                                                    
    wait(0);                                                                                                          
    signal(SIGCHLD, child);      
}  
void server_main()
{
    ...
    signal(SIGCHLD, child);
    ...
    for(;;;) {
        ...
        switch(fork()) {
        ...
        }
    }

ハンドラーには、私を混乱させる 2 つの部分があります。1)。SIGCHLD は、子プロセスが終了または停止したときにキャッチされます。それでは、なぜハンドラー内で待機を呼び出す必要があるのでしょうか? 信号はすでに到着しています。2)。SIGCHLD ハンドラを再インストールする必要があるのはなぜですか。シグナル呼び出しはハンドラーを一度だけインストールしませんか?

ありがとう!

4

2 に答える 2

2
  1. 子プロセスの実行が終了すると、SIGCHLD がトリガーされます。ただし、親が子の終了値を取得できるようにするために、(いわゆるゾンビプロセスとして) プロセステーブルに残ります。を呼び出すwait()と、その子プロセスからプロセス テーブルがクリアされます。
  2. 子プロセスのみを作成するn場合、すべての子プロセスが終了したときにシグナル ハンドラーがまだ存在する理由はありませんn

の動作はUnix によって異なるsigactionため、代わりに を参照することをお勧めします。signal

于 2011-12-08T00:00:47.887 に答える
1

シグナルコールはハンドラーを完全にインストールしませんか?

この動作に依存することはできません。おそらくシグナルハンドラーはクリアされ、おそらくそれは持続します。これは、履歴信号処理の問題の一部です。私のシステムのsignal(3)マンページは次のように報告しています。

   When a signal occurs, and func points to a function, it is
   implementation-defined whether the equivalent of a:


          signal(sig, SIG_DFL);

   is executed or the implementation prevents some
   implementation-defined set of signals (at least including
   sig) from occurring until the current signal handling has
   completed.

sigaction(2)信頼性の低い信号は、SysVr4で導入され、POSIX.1-2001で標準化されたベースの信号にほぼ置き換えられました。

   struct sigaction {
      void     (*sa_handler)(int);
      void     (*sa_sigaction)(int, siginfo_t *, void *);
      sigset_t   sa_mask;
      int        sa_flags;
      void     (*sa_restorer)(void);
   };

   int sigaction(int signum, const struct sigaction *act,
                 struct sigaction *oldact);

これらは悲しいことに書くのがより複雑ですが、コードを書いたら、ハンドラーを再インストールする必要があるかどうか疑問に思う必要はありません-そして信号が1秒で到着することを心配する必要はありません信号を処理している間の時間。

于 2011-12-08T00:07:57.460 に答える