3

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

我在主程序中有这个选项,它可以运行 30 秒并终止程序,在这种情况下我执行 sleep(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 并忽略另一个信号,反之亦然。

因此,当我执行 sleep(30) 并查看结果时,您可以看到问题所在。任何见解。我已经尝试调试了好几天,但还没有成功。

4

1 回答 1

1

信号可能会在接收时合并(信号作为硬件中断控制器工作)。例子:

进程 2 向进程 10 发送信号 SIGUSR1,该进程当前未处于活动状态。

内核存储进程 10 有一个未决的 SIGUSR1

进程 3 向进程 10 发送信号 SIGUSR1,该进程当前未处于活动状态。

内核存储进程 10 有一个挂起的 SIGUSR1(它已经有)

进程10被调度进来,它看到SIGUSR1处于挂起状态,移除挂起并开始信号处理

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

当您现在添加使系统充满信号时,信号的时间表顺序可能会导致某些信号比其他信号更频繁地出现。

结论:信号不是作为沟通路径,而是推动进程。对于通信,您使用信号量、管道、文件等和信号来唤醒/告诉其他进程他们应该检查更改。

于 2016-04-19T11:27:27.040 回答