2

所以这是我们在学习指南中遇到的一个问题:

一个朋友想写一个程序,它有一个父进程和一个子进程,允许父进程计算子进程中的事件。这个想法是孩子在每个事件中向父母发送一个信号(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。所以我想我的问题是有什么我没有看到或者这是一个错字?几个小时前我给我的教授发了电子邮件,但仍然没有任何消息

4

1 回答 1

0

从您的描述中不清楚哪个进程有哪个睡眠时间,但是如果父母的时间比孩子的时间长,那么孩子可能会在父母有机会处理所有信号之前终止。考虑一个极端情况,即父母在第一个信号被捕捉到很长时间后进入睡眠状态,以至于孩子在父母醒来之前就退出了;在第一个之后它永远不会看到任何信号。

于 2012-10-17T01:15:27.797 回答