检查安装的信号处理程序

我有一个库为SIGSEGV安装一个信号处理程序进行debugging。 SIGSEGV处理程序只是打印一些信息,然后退出程序。

最近,我需要从Java调用这个库(使用JNI),而我遇到的问题是JVM还为SIGSEGV安装了一个信号处理程序,以实现比我更有用的目的。

所以我想要select的行动是,如果我的图书馆发现一个信号处理程序已经安装了一个信号,它根本不会安装任何信号。

为了清楚起见,我正在使用sigaction调用。

现在要实现我的function,我必须做的是:

一个。 阻止所有信号。

湾 调用sigaction并检查oact是否返回有效的处理程序。

C。 如果是这样的话,请重新调用sigaction作为新的行为。

d。 UNBLOCK信号。

B和C似乎对我来说很麻烦。 我想要的是能够确定一个特定的信号是否已经拥有一个处理程序,而不必先replace该处理程序,然后用原始处理程序重新replace它(无所作为)。

有没有比sigaction更细粒度的东西?

您可以调用sigaction(SIGSEGV, NULL, &sa)来查询信号处置而不改变它。

请注意,阻塞信号不会“锁定”其他线程,因为信号掩码是每个线程,而信号处置对于进程中的所有线程都是通用的。