所以这是我们在学习指南中遇到的一个问题:
一个朋友想写一个程序,它有一个父进程和一个子进程,允许父进程计算子进程中的事件。这个想法是孩子在每个事件中向父母发送一个信号(SIGUSR2)。父级有一个用于 SIGUSR2 的信号处理程序,每次处理程序执行时都会增加一个计数器。然后,父母可以在孩子终止后打印计数。
你的朋友试图在下面写一个原型。孩子向父母发送 5 个信号。你的朋友尝试在第 6 行和第 20 行调用 sleep 来模拟父母的工作和孩子的工作。他预计第 27 行打印的计数器值为 5。
但是,由于睡眠时间如下所示,他始终打印出值 1,而不是 5。
他问你为什么他得到1,而不是5。你的解释是什么?
#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。所以我想我的问题是有什么我没有看到或者这是一个错字?几个小时前我给我的教授发了电子邮件,但仍然没有任何消息