如果我发送多个后续的Hangup信号到下面的程序,只有两个会被处理,其余的将被忽略:
#include <stdio.h> #include <unistd.h> #include <signal.h> int id; void handler(int s) { id++; int i; for(i=0; i<3; i++) { printf("Sig %dn",id); sleep(2); } } int main() { int i; signal(SIGHUP,handler); for( i=0; ; i++ ) { printf("%dn",i); sleep(1); } return 0; }
我使用以下命令将信号发送到进程:
kill -l {#process}
如果连续三次运行上述命令,第三个信号将被忽略,如下面的输出:
0 1 2 3 4 5 6 7 Sig 1 Sig 1 Sig 1 Sig 2 Sig 2 Sig 2 8 9 10 11 12
有什么方法可以捕捉到第三个信号?
Windows相当于SIGPROF
如何在multithreading环境中处理SIGPIPE?
如何处理在Windows机器上的Python的信号
WEXITSTATUS(状态)返回什么?
杀戮和孩子的过程
我如何触发默认的信号处理行为?
与sigdelset()函数混淆
QProcess :: close()会在进程中引发unix SIGTERM信号吗?
通常情况下,你不能用标准信号来做。 Unix内核通常只排队一个待处理的信号。 如果在Sig1处理程序中处理睡眠时发送Sig2和Sig3,则它们将被合并。
您可以使用sigaction(2)来设置您的信号处理程序并为其提供SA_NODEFER标志。 它将允许在信号处理器中传送新的信号。 确保你的处理程序是reenterant,这是错误的解决方案。
还有称为“实时信号”的POSIX.1b(POSIX.1-2001)扩展名。 这样的信号可以排队多次,但SIGHUP不是其中之一。 Linux上的信号(7)表示实时信号编号为33(SIGRTMIN)至64(SIGRTMAX)。
在Linux上,待处理的信号只用一位表示。 这意味着如果在处理程序已经运行的时候生成了多个信号,那么只会再次调用它。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。