奇怪的结果是多进程信号处理程序

时间:2012-09-30 00:56:08

标签: c signals multiprocess

我有这个多进程程序,它由9个进程组成。一个是产生3个信号生成过程和4个信号处理过程的主要过程。一个是监控过程。现在我使用了两个信号SIGUSR1和SIGUSR2。每个处理程序都可以处理SIGUSR1或SIGUSR2。每当它们接收到信号时,它们将共享存储器中信号SIGUSR1和SIGUSR2的计数增加1.监视过程也接收信号,因为信号被发送到过程组。它可以处理两个信号并将其本地信号数增加1.当它达到10时,它会在共享存储器中打印出SIGUSR1和SIGUSR2计数值。

我在主程序中有这个选项,它可以运行30秒并终止程序,在这种情况下我会睡觉(30)然后终止程序。在第二种情况下,它忙于等待一个while循环,计算共享内存中SIGUSR1和SIGUSR2的总数。当它达到100000时,它终止程序。

这是我的两个版本的输出

对于100000秒版本

对于100000信号版本输出

  Initializing the shared memory
   End of initializing the shared memory
   Registering the signal handlers
   End of registering the signal handlers
   Registering the monitoring process
   Monitor's pid is 6635
   End of registering the monitoring process
   Registering the signal generators
   Interval SIGUSR1 = 5.79953e-05
   Interval SIGUSR2 = 8.69632e-05
   Count SIGUSR1 = 10
   Count SIGUSR2 = 10
   Count SSIGUSR1 = 5
   Count SSIGUSR2 = 5

   Interval SIGUSR1 = 7.64132e-05
   Interval SIGUSR2 = 5.72999e-05
   Count SIGUSR1 = 16
   Count SIGUSR2 = 24
   Count SSIGUSR1 = 8
   Count SSIGUSR2 = 12

对于30秒版本

初始化共享内存

 End of initializing the shared memory
   Registering the signal handlers
   End of registering the signal handlers
   Registering the monitoring process
   Monitor's pid is 6719
   End of registering the monitoring process
   Registering the signal generators
   Inside option 1
   Interval SIGUSR1 = 0.000246763
   Interval SIGUSR2 = 0.000222743
   Count SIGUSR1 = 93
   Count SIGUSR2 = 222
   Count SSIGUSR1 = 92
   Count SSIGUSR2 = 111

   Interval SIGUSR1 = 0.000664711
   Interval SIGUSR2 = 0.000390577
   Count SIGUSR1 = 102
   Count SIGUSR2 = 234
   Count SSIGUSR1 = 97
   Count SSIGUSR2 = 117

为什么结果在第二种情况下如此滞后。我的意思是当监视器首先打印输出时,处理线程记录的SIGUSR1和SIGUSR2的计数已经达到93和222.此外,信号被发送到进程组。因此,每个信号由两个处理程序和一个监视器处理。在处理程序的情况下只有两个,因为在四个汉德中,两个处理SIGUSR1而忽略另一个信号,反之亦然。

因此,当我睡觉时你可以看到什么是错的(30)并看到结果。任何见解。我一直试图调试这几天但尚未成功。

1 个答案:

答案 0 :(得分:0)

信号可能在接收时合并(信号用作硬件中断控制器)。例如:

进程2将信号SIGUSR1发送到进程10,进程10当前未激活。

内核存储进程10有一个待处理的SIGUSR1

进程3将信号SIGUSR1发送到进程10,进程10当前未激活。

内核存储进程10有一个待处理的SIGUSR1(它已有)

进程10被安排在,它看到SIGUSR1正在等待,删除待处理和启动信号处理

结果,进程10只看到一个SIGUSR1。

当您现在添加信号系统泛滥时,信号按计划的顺序可能会导致某些信号比其他信号更频繁地出现。

结论: 信号不是通信路径,而是微调进程。对于通信,您使用信号量,管道,文件等,以及唤醒/告知其他进程应检查更改的信号。

相关问题