我有一个库,可以安装SIGSEGV的信号处理程序以进行调试。 SIGSEGV处理程序只打印一些信息然后退出程序。
最近,我需要从Java调用这个库(使用JNI),我遇到的问题是JVM还为SIGSEGV安装了一个信号处理程序,比我的更有用。
所以我想要选择的动作是,如果我的库找到已经为信号安装的信号处理程序,它就不会安装任何信号。
为清楚起见,我正在使用sigaction call。
现在要实现我的功能,我必须做的是:
一个。阻止所有信号。
湾调用sigaction并检查oact是否返回有效的处理程序。
℃。如果确实如此,请将oact作为新行为重新调用sigaction。
d。 UNBLOCK信号。
对我来说B和c似乎很麻烦。我想要的是能够确定一个特定的信号是否已经有一个处理程序而没有先替换处理程序,然后用原始处理程序重新替换它(什么都不做)。是否有比sigaction更精细的内容?
答案 0 :(得分:2)
您可以致电sigaction(SIGSEGV, NULL, &sa)
查询信号处理情况,而无需更改信号处理。
请注意,阻塞信号不会“锁定”其他线程,因为信号掩码是每个线程,而信号处理对于进程中的所有线程都是通用的。