当前位置: 技术问答>linux和unix
对信号处理函数的迷惑!
来源: 互联网 发布时间:2015-12-17
本文导语: 各位高手们,我现在看一本linux入门书,看到里面对于信号处理函数的讲解,对于有些部分不能理解,希望大家帮我讲讲。 如果在main函数里面写了一个信号处理函数的调用,例如:signal(SIGALRM,on_alarm), 但是怎么在实...
各位高手们,我现在看一本linux入门书,看到里面对于信号处理函数的讲解,对于有些部分不能理解,希望大家帮我讲讲。
如果在main函数里面写了一个信号处理函数的调用,例如:signal(SIGALRM,on_alarm), 但是怎么在实际定义这个信号处理函数的时候,又在on_alarm函数内部出现了signal(SIGALRM, on_alarm)呢?这样不是递归了吗?那怎么跳出递归函数呢?
比如说:
void main()
{
...
sihnal(SIGALRM, on_alarm);
...
}
void on_alarm()
{
signal(SIGALRM, on_alarm);
...
}
诸位理解这个意思的请帮我讲讲,多谢了!
如果在main函数里面写了一个信号处理函数的调用,例如:signal(SIGALRM,on_alarm), 但是怎么在实际定义这个信号处理函数的时候,又在on_alarm函数内部出现了signal(SIGALRM, on_alarm)呢?这样不是递归了吗?那怎么跳出递归函数呢?
比如说:
void main()
{
...
sihnal(SIGALRM, on_alarm);
...
}
void on_alarm()
{
signal(SIGALRM, on_alarm);
...
}
诸位理解这个意思的请帮我讲讲,多谢了!
|
(1)执行signal(SIGALRM,on_alarm),是注册SIGALRM信号的处理函数为on_alarm,这时on_alarm不会被执行。当进程接收到SIGALARM的时候,on_alarm才调用。
(2)在on_alarm里面又调用了signal(SIGALRM,on_alarm)进行注册。是因为:用户注册的信号处理函数只能有效一次,要想继续有效,继续使用on_alarm处理今后的SIGALARM信号,必须再次注册。
(2)在on_alarm里面又调用了signal(SIGALRM,on_alarm)进行注册。是因为:用户注册的信号处理函数只能有效一次,要想继续有效,继续使用on_alarm处理今后的SIGALARM信号,必须再次注册。
|
这样不是递归了吗?那怎么跳出递归函数呢?
这种写法是不可靠的信号处理方试,为了防止在信号处理函数on_alarm时对另一个到来的SIGALRM丢失(其实是默认处理)
楼主认为的递归一般是不存在的,除非你连续不断地发送SIGALRM信号,这时才会递归地调用signal不断地捕捉该信号.
采用sigaction就不会有这样的问题了.
这种写法是不可靠的信号处理方试,为了防止在信号处理函数on_alarm时对另一个到来的SIGALRM丢失(其实是默认处理)
楼主认为的递归一般是不存在的,除非你连续不断地发送SIGALRM信号,这时才会递归地调用signal不断地捕捉该信号.
采用sigaction就不会有这样的问题了.
|
应该不是纠错吧
1.来了SIGALARM都发送给此进程
2.在on_alarm里面又调用了signal(SIGALRM,on_alarm),是因为在有的系统中默认的一个信号处理函数只能有效一次,如果你的系统不是,那一句也可以去掉,
3.可以用sigaction,开始就设置好
1.来了SIGALARM都发送给此进程
2.在on_alarm里面又调用了signal(SIGALRM,on_alarm),是因为在有的系统中默认的一个信号处理函数只能有效一次,如果你的系统不是,那一句也可以去掉,
3.可以用sigaction,开始就设置好