微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何捕捉两个以上的连续信号?

如果我发送多个后续的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

有什么方法可以捕捉到第三个信号?

为什么线程函数不能调用? (SIGEV_THREAD)

Windows相当于SIGPROF

如何在multithreading环境中处理SIGPIPE?

如何处理在Windows机器上的Python的信号

WEXITSTATUS(状态)返回什么?

如何将信号名称(string)转换为信号代码

杀戮和孩子的过程

我如何触发认的信号处理行为?

与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] 举报,一经查实,本站将立刻删除。

相关推荐