如果在main函数里面写了一个信号处理函数的调用,例如:signal(SIGALRM,on_alarm), 但是怎么在实际定义这个信号处理函数的时候,又在on_alarm函数内部出现了signal(SIGALRM, on_alarm)呢?这样不是递归了吗?那怎么跳出递归函数呢?
比如说:
void main()
{
...
sihnal(SIGALRM, on_alarm);
...
}
void on_alarm()
{
signal(SIGALRM, on_alarm);
...
}
诸位理解这个意思的请帮我讲讲,多谢了!
7 个解决方案
#1
(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信号,必须再次注册。
#2
这样不是递归了吗?那怎么跳出递归函数呢?
这种写法是不可靠的信号处理方试,为了防止在信号处理函数on_alarm时对另一个到来的SIGALRM丢失(其实是默认处理)
楼主认为的递归一般是不存在的,除非你连续不断地发送SIGALRM信号,这时才会递归地调用signal不断地捕捉该信号.
采用sigaction就不会有这样的问题了.
这种写法是不可靠的信号处理方试,为了防止在信号处理函数on_alarm时对另一个到来的SIGALRM丢失(其实是默认处理)
楼主认为的递归一般是不存在的,除非你连续不断地发送SIGALRM信号,这时才会递归地调用signal不断地捕捉该信号.
采用sigaction就不会有这样的问题了.
#3
采用sigaction就不会有这样的问题了.
同意楼上
同意楼上
#4
nevil说的是为了防止在调用信号处理函数on_alarm时对另一个到来的SIGALARM产生丢失,那我想问一下,来信号了是内核发信号给进程,那么在还没有调用on_alarm时来了个信号,是发给主进程的;在on_alarm调用时,来了个信号,不也是发给主进程的吗?那么主进程是怎么约定由谁来处理的呢? 是为了纠错这个道理我理解了,但是不理解信号是怎么发的,或者说是信号怎么约定发给哪个对象的,请解释一下。
#5
应该不是纠错吧
1.来了SIGALARM都发送给此进程
2.在on_alarm里面又调用了signal(SIGALRM,on_alarm),是因为在有的系统中默认的一个信号处理函数只能有效一次,如果你的系统不是,那一句也可以去掉,
3.可以用sigaction,开始就设置好
1.来了SIGALARM都发送给此进程
2.在on_alarm里面又调用了signal(SIGALRM,on_alarm),是因为在有的系统中默认的一个信号处理函数只能有效一次,如果你的系统不是,那一句也可以去掉,
3.可以用sigaction,开始就设置好
#6
弄明白了,结贴!谢谢各位!
#7
说“signal函数是一次性的”已经是老皇历了,原始的UNIX和SYS V会把信号处理重置到SIG_DFL
以防止重入,而从BSD开始的系统就不这样做了,而是利用信号屏蔽字保证信号处理函数不会重入
你的代码有年头了吧?
#1
(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信号,必须再次注册。
#2
这样不是递归了吗?那怎么跳出递归函数呢?
这种写法是不可靠的信号处理方试,为了防止在信号处理函数on_alarm时对另一个到来的SIGALRM丢失(其实是默认处理)
楼主认为的递归一般是不存在的,除非你连续不断地发送SIGALRM信号,这时才会递归地调用signal不断地捕捉该信号.
采用sigaction就不会有这样的问题了.
这种写法是不可靠的信号处理方试,为了防止在信号处理函数on_alarm时对另一个到来的SIGALRM丢失(其实是默认处理)
楼主认为的递归一般是不存在的,除非你连续不断地发送SIGALRM信号,这时才会递归地调用signal不断地捕捉该信号.
采用sigaction就不会有这样的问题了.
#3
采用sigaction就不会有这样的问题了.
同意楼上
同意楼上
#4
nevil说的是为了防止在调用信号处理函数on_alarm时对另一个到来的SIGALARM产生丢失,那我想问一下,来信号了是内核发信号给进程,那么在还没有调用on_alarm时来了个信号,是发给主进程的;在on_alarm调用时,来了个信号,不也是发给主进程的吗?那么主进程是怎么约定由谁来处理的呢? 是为了纠错这个道理我理解了,但是不理解信号是怎么发的,或者说是信号怎么约定发给哪个对象的,请解释一下。
#5
应该不是纠错吧
1.来了SIGALARM都发送给此进程
2.在on_alarm里面又调用了signal(SIGALRM,on_alarm),是因为在有的系统中默认的一个信号处理函数只能有效一次,如果你的系统不是,那一句也可以去掉,
3.可以用sigaction,开始就设置好
1.来了SIGALARM都发送给此进程
2.在on_alarm里面又调用了signal(SIGALRM,on_alarm),是因为在有的系统中默认的一个信号处理函数只能有效一次,如果你的系统不是,那一句也可以去掉,
3.可以用sigaction,开始就设置好
#6
弄明白了,结贴!谢谢各位!
#7
说“signal函数是一次性的”已经是老皇历了,原始的UNIX和SYS V会把信号处理重置到SIG_DFL
以防止重入,而从BSD开始的系统就不这样做了,而是利用信号屏蔽字保证信号处理函数不会重入
你的代码有年头了吧?