如何捕获两个以上的连续信号
How to have more than two consecutive signals caught?
如果我向以下程序发送多个后续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
有没有办法也捕捉到第三个信号?
通常,您不能使用标准信号。Unix内核通常只对一个待挂信号进行排队。如果Sig2和Sig3在Sig1处理程序中休眠时被发送,它们将被合并。
你可以使用sigaction(2)来设置你的信号处理程序,并为它提供SA_NODEFER标志。它将允许在信号处理程序中传递新信号。确保你的处理程序是可重入的,这是一个容易出错的解决方案。
还有POSIX.1b (POSIX.1-2001)扩展称为"实时信号"。这样的信号可以多次排队,但SIGHUP不是其中之一。Linux上的signal(7)表示实时信号编号为33 (SIGRTMIN)到64 (SIGRTMAX)。
在Linux上,挂起信号只用一位表示。这意味着如果在处理程序已经运行时生成了多个信号,那么它只会被再次调用一次。
相关文章:
- Qt VTK交互风格的信号到小部件
- 获取日期异步信号安全吗?如果在信号处理程序中使用,它会导致死锁吗
- 模板元程序查找相似的连续类型名称
- 如何将点击的信号和插槽添加到qt中的自定义按钮中
- 如何在没有信号的情况下从C++执行QML插槽
- 线程之间的布尔停止信号
- 如何在信号处理程序和普通函数中对全局变量进行互斥读写操作
- EASTL矢量<向量<int>>连续的
- 当用户在qtablewidget中输入单元格时,如何获得信号?C++
- 当需要超过16GB的连续内存时,内存分配失败
- 有可能在信号处理程序中设置promise吗
- 代码在我的计算机上运行良好,但是在将其提交给coursera时遇到未知的信号11问题
- 在条件变量中触发错误信号的频率是多少
- 我应该如何表示我拥有的连续元素序列?
- 蛇在C++不会连续转两次
- 有没有一种优雅而快速的方法来测试整数中的 1 位是否位于连续区域
- 在信号处理程序中捕获C++未处理的异常并恢复应用程序
- 调试和自由执行中的信号处理
- boost::asio-signal_set处理程序仅在捕获第一个信号后执行,并忽略相同类型的连续信号
- 如何捕获两个以上的连续信号