在一个应用中,注册了信号的处理函数,并添加了相应的处理。
主程序中,同时也调用了msgrcv
接口(工作在阻塞状态下)。程序运行在前台,当按下ctrl+c
的时信号处理函数并没有收到该信号,而是msgrcv
收到信号中断退出了。这样的话,信号处理函数就没有什么作用了。
针对这个问题,大家如何看,又如何处理?
在一个应用中,注册了信号的处理函数,并添加了相应的处理。
主程序中,同时也调用了msgrcv
接口(工作在阻塞状态下)。程序运行在前台,当按下ctrl+c
的时信号处理函数并没有收到该信号,而是msgrcv
收到信号中断退出了。这样的话,信号处理函数就没有什么作用了。
针对这个问题,大家如何看,又如何处理?
ctrl+c发送信号
我个人认为,信号处理方式应该不是按照正常的消息处理的,应该属于软中断的方式。
如果单纯的想处理ctrl+c的消息的话,使用signal函数就是了,而且根据该还是的调用方式,将处理函数与信号绑定,以回调的方式进行调用,那么信号的产生方式大概就是软中断。所以使用阻塞态也不一定可以捕获到。
好问题.
"信号处理函数并没有收到该信号,而是msgrcv收到信号中断退出"
-- 不是这样的. signal handler有收到信号, 但是msgrcv 在 signal handler返回后, 不会被 自动重启.
http://linux.die.net/man/7/signal
对于msgrcv, http://linux.die.net/man/2/msgrcv
所以你需要把msgrcv 放入循环: