如果我向以下程序发送多个后续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 %d\n", id);
sleep(2);
}
}
int main()
{
int i;
signal(SIGHUP, handler);
for( i=0; ; i++ )
{
printf("%d\n", i);
sleep(1);
}
return 0;
}
我使用以下命令向进程发送信号:
kill -l {#process}
如果我连续三次运行上述命令,第3个信号将被忽略,如下面的输出所示:
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
有没有办法捕获第三个信号?
答案 0 :(得分:2)
通常情况下,您无法使用标准信号。 Unix内核通常只排队一个待处理信号。如果在进程在Sig1处理程序中休眠时发送Sig2和Sig3,则它们将被合并。
您可以使用sigaction(2)设置信号处理程序并为其提供SA_NODEFER标志。它将允许在信号处理器中传递新信号。确保你的处理程序是重新检测的,这是容易出错的解决方案。
还有POSIX.1b(POSIX.1-2001)扩展称为“实时信号”。这些信号可以多次排队,但SIGHUP不是其中之一。 Linux上的signal(7)声明实时信号编号为33(SIGRTMIN)到64(SIGRTMAX)。
答案 1 :(得分:1)
在Linux上,待处理信号仅用一位表示。这意味着如果在处理程序已经运行时生成多个信号,那么它将再次被调用。