为什么中断信号SIGINT处理函数不生效?

问题背景

一个测试可代码编的可执行程序中,执行开始之后,然后按下Ctrl-C,中断程序运行,看core文件,程序是跑到了一个第三方的库里面coredump了。

问题初步分析

正常的怀疑,就是自己没有安装中断处理函数,导致出问题。那么步骤1:尝试自己安装中断处理函数。

自己的代码是一个zmq的poll阻塞式调用。在ZMQ系统开始初始化之前,安装了一个中断处理函数。

函数代码大致如下:

中断信号处理函数

在初始化的时候,执行了s_catch_signals()对函数在系统中注册。

再进行问题的重试。结果还是一样,core的结果还是一样。

尝试在GDB中进行调试,结果还是一样,中断处理的过程,直接跑到了一个第三方的库里面导致coredump,有点蒙了。

深入分析

遇到这类问题,首先要做的就是:不要急!

先看看这个第三方的库,看目录和名称,应该是oracle的。我的程序中确实使用了oracle的数据库连接的功能。

然后再看看它的堆栈函数的名称:sslsshandler,怎么也是个handler,难道是它安装了中断处理函数?跑到它里面去了?见鬼了。这得怎么弄。

第一反应就是找到它是哪里安装的,我的代码里面并没有显式安装第三方库的中断函数,那肯定就是调用DB操作的时候安装了。

扫描二维码关注公众号,回复: 1926020 查看本文章

得出尝试方法:试着把s_catch_signals()这个操作放到DB连接之后进行,是不是后安装的直接覆盖了前面安装的原因导致。

问题结论

与问题分析中猜想的一致。在DB连接之后再安装中断信号函数,则可以生效,coredump问题解决

结论:如果第三方库中抢了中断信号处理权限,则我们在第三方库安装之后再安装方可生效我们自定义的中断信号处理操作。


猜你喜欢

转载自blog.csdn.net/dreamvyps/article/details/80845797