2

ですから、これは私たちが学習ガイドで得た質問です。

友人は、親と子プロセスを使用して、親が子のイベントをカウントできるようにするプログラムを作成したいと考えています。アイデアは、子が各イベントで親にシグナル(SIGUSR2)を送信することです。親には、ハンドラーが実行されるたびにカウンターをインクリメントするSIGUSR2のシグナルハンドラーがあります。子が終了した後、親はカウントを出力できます。

あなたの友人は以下のプロトタイプを書こうとしました。子は親に5つの信号を送信します。あなたの友人は、親による仕事と子供による仕事をシミュレートするために、6行目と20行目で寝るという呼びかけでそれを試しました。彼は、27行目に印刷されたカウンター値が5になることを期待していました。

ただし、以下のスリープ時間で、彼は一貫して5ではなく1の値を出力しました。

彼はなぜ彼が5ではなく1を得たのかとあなたに尋ねます。あなたの説明は何ですか?

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <sys/wait.h>


1   int counter = 0;
2   
3   void handler(int sig) 
4   {
5       counter++;
6       sleep(1); /* Parent does some work in the handler */
7       return;
8   }
9   
10  int main() 
11  {
12      int i;
13  
14      signal(SIGUSR2, handler);
15  
16      if (fork() == 0) {  /* Child */
17      for (i = 0; i < 5; i++) {
18          kill(getppid(), SIGUSR2);
19          printf("sent SIGUSR2 to parent\n");
20          sleep(1); /* Child does some work */
21    
22      }
23      exit(0);
24      }
25  
26      waitpid(-1, NULL, 0);
27      printf("counter=%d\n", counter); 
28      exit(0);
29  }

それは私には正しいように見えました、そして私がコードを取りそしてそれを実行したとき、それが私に与えた出力は5でした。数時間前に教授にメールを送りましたが、まだ何も聞こえません

4

1 に答える 1

0

どのプロセスがどのスリープ時間を持っていたかは説明からは明らかではありませんが、親の時間が子の時間よりも長い場合、親がすべての信号を処理する機会を得る前に子が終了する可能性があります。最初の信号がキャッチされた後、親がスリープ状態になり、親が目を覚ます前に子が終了するという極端なケースを考えてみます。最初の信号以降は信号が表示されません。

于 2012-10-17T01:15:27.797 に答える