ですから、これは私たちが学習ガイドで得た質問です。
友人は、親と子プロセスを使用して、親が子のイベントをカウントできるようにするプログラムを作成したいと考えています。アイデアは、子が各イベントで親にシグナル(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でした。数時間前に教授にメールを送りましたが、まだ何も聞こえません