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