当前位置: 技术问答>linux和unix
关于linux下的signal函数的问题
来源: 互联网 发布时间:2017-03-19
本文导语: 这几天都在看一个高手些的一个贪吃蛇的代码,但是遇到了一个问题。非常不理解 void show() { signal(SIGALRM, show); //设置中断信号 showInformation(); showSnake(); refresh();...
这几天都在看一个高手些的一个贪吃蛇的代码,但是遇到了一个问题。非常不理解
void show()
{
signal(SIGALRM, show); //设置中断信号
showInformation();
showSnake();
refresh(); //刷新真实屏幕
}
不懂 signal(SIGALRM, show); 为什么要自己的调用自己,这样不就无止境的循环了吗?
请求高手解决
void show()
{
signal(SIGALRM, show); //设置中断信号
showInformation();
showSnake();
refresh(); //刷新真实屏幕
}
不懂 signal(SIGALRM, show); 为什么要自己的调用自己,这样不就无止境的循环了吗?
请求高手解决
|
这是串行的, show是被调用的函数,不可能同时存在2个show在调用。
信号来了,show被调用了,然后show重新设置信号处理函数为show,然后退出,信号掩码恢复,下一个定时信号到来,再次调用show,如此循环。
之所以show里又signal是因为古老的实现signal在触发一次后就恢复默认处理函数了,所以一般现在都是用sigaction了。
信号来了,show被调用了,然后show重新设置信号处理函数为show,然后退出,信号掩码恢复,下一个定时信号到来,再次调用show,如此循环。
之所以show里又signal是因为古老的实现signal在触发一次后就恢复默认处理函数了,所以一般现在都是用sigaction了。
|
不可以,不是触发,是设置。设置以后,当进程收到SIGALRM信号,show函数会被调用。
|
signal(SIGALRM, show); // 只是设置信号处理函数不会调用
有些系统用signal设置信号处理函数后,如果收到信号,系统会把信号处理函数设置为默认值,这里作为补救措施重新设置信号处理函数。
详细的解释可以读APUE或者搜索“可靠信号处理”
有些系统用signal设置信号处理函数后,如果收到信号,系统会把信号处理函数设置为默认值,这里作为补救措施重新设置信号处理函数。
详细的解释可以读APUE或者搜索“可靠信号处理”
|
这个只是设置信号处理函数吧
|
只是有可能在执行这个show函数的时候可能会触发ALarm信号,所以加在里面,当没有触发信号的时候就不会再回头执行show函数的。