- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个由 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/
我只是在 Mac OS X 中玩信号。 为什么在我的信号处理程序完成后,以下代码不会产生 SIGSEGV 的默认行为?在 Linux 下,代码运行良好。 #include #include #in
信号是由操作系统传给进程的中断,会提早终止一个程序。在 UNIX、LINUX、Mac OS X 或 Windows 系统上,可以通过按 Ctrl+C 产生中断。 有些信号不能被程序捕获,但是下表所
C、C++ 程序中,信号常常作为进程间通信的一种重要手段。举个例子: #include <stdio.h> #include <unistd.h> #include <
是否有关于重叠处理的任何好的(如果可能的话)科学资源(网络或书籍)。我对分析信号时使用重叠处理和窗口的效果不感兴趣,因为要求是不同的。有关以下实时情况的更多信息:(我当前正在处理音频信号) 将信号分成
在下面的代码中: #include #include #include #include #include using namespace std; void signal_callback_
我是操作系统的新手,在学习 Linux 信号处理时遇到了一些问题。 在 Linux 中,如果信号在系统调用期间到达,例如 pause(),程序将切换到内核模式并运行信号处理程序。然后根据处理函数,程序
我正在尝试在 shell 中实现一个简单的两级管道。 当我不做第二个 fork 而只是在父级中执行管道的其余实现时,它工作正常但我退出了 shell。这就是为什么我想做第二个 fork,这样我就不会退
我写了一个小脚本,用 Python 做了一些非常耗时的事情,我包含了一个信号处理模块,用于监听 SIGINT、SIGQUIT 和 SIGINFO,当用户输入 SIGQUIT 或 SIGINFO 时打印
我有一个正在读取的传感器,目前代码是用 Java 编写的,但我认为问题不是特定于语言的,更多的是与方法相关。 传感器会产生具有高脉冲和低脉冲的信号,大致类似于心跳。然而,“高”脉冲并不总是相同的电平,
使用mpirun时,是否可以在运行的代码中捕获信号(例如,^C生成的SIGINT)? 例如,我正在运行并行化的 Python 代码。在单独运行 python blah.py 时,我可以 except
如果 linux 进程正在等待 I/O(即它处于 SLEEP 状态)并且针对它发出 SIGKILL 信号,则在终止时( STOPPED 状态)是否会通过RUNNING 或READY 状态? 换句话说,
当进程正在执行阻塞系统调用时,比如读或写,信号已经到达。系统调用是否因错误 EINTR 而终止?处理系统调用后是否重启系统调用? 假设系统调用因错误 EINTR 终止,内核在返回用户空间之前处理该信号
有人可以解释为什么我们不应该从信号处理程序调用非异步函数吗?就像调用此类函数时破坏程序的确切步骤顺序一样。而且,信号是否总是在单独的堆栈上运行?如果是这样,它是一个单独的上下文还是在信号线程的上下文中
我在处理多线程服务器中的信号处理时遇到了麻烦。我为每个连接创建一个线程,但我希望有一个选项可以使用 SIGINT 终止服务器。但是,当其中一个线程捕获到信号时,事情会变得很糟糕。除了主线程之外,有什么
我写了一个扭曲的程序来处理来自 TCP 套接字和原始套接字的请求。由于 twisted 不支持原始线程,我在名为“raw_socket_loop”的函数中编写了原始套接字选择轮询循环。主 react
这个问题在这里已经有了答案: c: catch a segfault in exec() which was run in a child process (1 个回答) 关闭 6 年前。 我有一个
我有一个 repeat python 函数和一个只有一个按钮的 test.ui。我的疑问是每次单击按钮时如何准确地循环一次相同的功能。因为对我来说,每当我表演时: self.pushButton.cl
我想禁用像 SIGINT 这样的信号,它是通过按 CTRL_C 发送的,还有其他将终止 JVM 的信号。我在此处阅读了有关-Xrs 选项的信息 http://docs.oracle.com/javas
这个问题在这里已经有了答案: Getting fault address that generated a UNIX signal (2 个答案) 关闭 5 年前。 有没有办法找出被某些信号中断的机
是否可以通过 Erlang 中的处理程序捕获 Linux 信号(例如 SIGUSR1)? (无需求助于用 C 编写的驱动程序) 最佳答案 (不是真正的答案) 2001 年有人问: Does anyon
我是一名优秀的程序员,十分优秀!