计算机系统问题2期中学习指南

时间:2012-10-16 23:40:26

标签: c

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

朋友想要编写一个包含父级和子级进程的程序,该程序允许父级计算子级中的事件。这个想法是孩子在每个事件中向父母发送信号(SIGUSR2)。父有一个SIGUSR2的信号处理程序,每次执行处理程序时都会递增一个计数器。然后,父母可以在孩子终止后打印计数。

你的朋友试图在下面写一个原型。孩子向父母发送5个信号。你的朋友试着在第6和第20行睡觉,以模拟父母的工作和孩子的工作。他预计第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.所以我想我的问题是有什么我没有看到或这是一个错字?我几个小时前通过电子邮件发送了我的教授,但仍然没有听到任何消息

1 个答案:

答案 0 :(得分:0)

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