gpt4 book ai didi

c - 多进程信号处理程序中的奇怪结果

转载 作者:行者123 更新时间:2023-12-02 03:55:55 25 4
gpt4 key购买 nike

我有一个由 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) 并查看结果时,您可以看到有什么问题。任何见解。几天来我一直在尝试调试它,但还没有成功。

最佳答案

信号可能会在接收时合并(信号作为硬件中断 Controller 工作)。示例:

进程 2 向进程 10 发送信号 SIGUSR1,进程 10 当前未处于事件状态。

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

进程 3 向进程 10 发送信号 SIGUSR1,进程 10 当前未处于事件状态。

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

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

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

当您现在添加用信号淹没系统时,信号的调度顺序可能会导致某些信号比其他信号出现得更频繁。

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

关于c - 多进程信号处理程序中的奇怪结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12657797/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com