我正在C ++的Linux上开发一个应用程序(真正的服务/守护进程),它需要与一个硬件接口。 如果我的程序在终止时没有彻底释放这个硬件资源,那么我必须重新加载设备驱动程序,这个过程大概需要10分钟,而且显而易见,在每个程序testing之间等待10分钟令人沮丧。
所以我使用了sigaction()
函数来捕获一个SIGINT(一个ctrl-c),这样我的程序就可以完成closures了。 从控制台运行程序时,这工作正常。 但是,在NetBeans或Eclipse中进行debugging时(我已经尝试过)都不行。
kill -SIGINT <pid>
,程序就会中断,就好像它碰到了一个断点 kill -SIGINT <pid>
,则行为与上述相同 kill
。 这一次,没有对话框出现,信号处理程序从不跳闸。 我需要一些方法来清理closures我的应用程序,而我正在debugging。 有任何想法吗?
事实证明,这个问题与Netbeans或Eclipse无关,而是gdb。
gdb可以配置为以各种方式处理信号。 如果你运行:
gdb
然后输入:
info signals
你会得到一个信号列表和gdb动作,如果它接收到该信号,该怎么做:
Signal Stop Print Pass to program Description SIGHUP Yes Yes Yes Hangup SIGINT Yes Yes No Interrupt SIGQUIT Yes Yes Yes Quit SIGILL Yes Yes Yes Illegal instruction SIGTRAP Yes Yes No Trace/breakpoint trap
等等…
我的临时工作是使用SIGALRM,gdb默认不会中断并发送到进程。 但是,您也可以通过创建一个.gdbinit文件来自定义默认的gdb设置,您可以在其中设置这些文件
即使这个帖子老了,希望能帮助别人。
为防止Eclipse捕获Ctrl + C,可以使用.gbdinit文件配置gdb。 你用这个内容创建一个.gdinit
#we want Ctrl+C to be no break, pass to application and printed by the debugger handle SIGINT nostop handle SIGINT pass handle SIGINT print
在你的eclipse配置中,你可以定义你的.gdbinit文件在Debug配置中使用的位置
简单的解决方案..尝试使用DEBUG宏来处理您的情况。
// Register the signal handler to stop service. #ifdef _DEBUG signal(SIGKILL, <your signal handler>); #endif
此外,您可能会尝试清理您的应用程序,然后退出。