日期:2014-05-16  浏览次数:20696 次

关于linux下的signal函数的问题
这几天都在看一个高手些的一个贪吃蛇的代码,但是遇到了一个问题。非常不理解

void show()
{
    signal(SIGALRM, show);        //设置中断信号
    showInformation();             
    showSnake();
    refresh();                    //刷新真实屏幕
}
不懂  signal(SIGALRM, show);  为什么要自己的调用自己,这样不就无止境的循环了吗?
请求高手解决
------解决方案--------------------
signal(SIGALRM, show); // 只是设置信号处理函数不会调用

有些系统用signal设置信号处理函数后,如果收到信号,系统会把信号处理函数设置为默认值,这里作为补救措施重新设置信号处理函数。
详细的解释可以读APUE或者搜索“可靠信号处理”
------解决方案--------------------
这个只是设置信号处理函数吧
------解决方案--------------------
引用:
那大侠的意思是没有执行show()函数,只是触发一次show 函数信号吗?
那我可以把这条语句去掉吗?

不可以,不是触发,是设置。设置以后,当进程收到SIGALRM信号,show函数会被调用。

------解决方案--------------------
这是串行的, show是被调用的函数,不可能同时存在2个show在调用。

信号来了,show被调用了,然后show重新设置信号处理函数为show,然后退出,信号掩码恢复,下一个定时信号到来,再次调用show,如此循环。

之所以show里又signal是因为古老的实现signal在触发一次后就恢复默认处理函数了,所以一般现在都是用sigaction了。
------解决方案--------------------
引用:
引用:
你哪里看到它调自己了?
这个只是把自己作为一个函数的参数而且

那这样有什么意义吗?


只是有可能在执行这个show函数的时候可能会触发ALarm信号,所以加在里面,当没有触发信号的时候就不会再回头执行show函数的。