3

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

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

所以我要选择的操作是,如果我的库发现已经为信号安装了信号处理程序,它根本不会安装任何信号。

为清楚起见,我使用的是 sigaction 调用。

现在要实现我的功能,我要做的是:

一种。屏蔽所有信号。

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

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

d。UNBLOCK 信号。

B和c对我来说似乎很麻烦。我想要的是能够确定一个特定的信号是否已经有一个处理程序,而无需先替换处理程序,然后用原始处理程序重新替换它(什么都没有)。

还有什么比 sigaction 更细粒度的吗?

4

1 回答 1

2

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

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

于 2012-08-09T10:15:40.437 回答