Linux等效的Windows Hooks

时间:2011-11-01 01:32:19

标签: windows linux ipc signals

我想知道如何表达windows hook之类的内容 在Linux中。

我有一个带有各种线程的Linux应用程序。主线程当前为 ctrl c 安装了一个信号处理程序,捕获它并关闭应用程序。

我希望应用程序中的另一个线程首先处理 ctrl c 事件,然后传递给主线程。

2 个答案:

答案 0 :(得分:2)

据我所知,这样做很棘手。 Unix信号是原始的。

默认情况下,信号会传递到随机线程。为了解决这个问题,通常采用的技巧是阻止除一个线程之外的所有线程中的信号。最简单的方法是使用pthread_sigmask阻止main中的所有信号,然后创建线程(将继承信号掩码),然后创建一个单独的线程,在sigwait/sigwaitinfo上执行pthread_kill阻塞的信号。这会强制将信号传递到该线程。

在信号捕获线程中消耗信号后,您需要使用main的线程ID和捕获的信号编号执行{{1}}以将信号转发到main。问题是主要会阻止它。

在转发信号之前,你无法真正解锁main并阻塞信号捕获线程,因为它是一个竞争条件 - 没有什么能阻止第二个信号进入并且信号捕获线程没有看到它。这打败了整个努力。

你可以让信号线程通过其他形式的IPC(管道或其他任何形式)发送消息给主要说“抓住XX,采取适当的行动”。也许这就足够了?

也许有人有一些聪明的想法,但我怀疑底线是这不是通常在unix中完成的方式。

答案 1 :(得分:0)

另一个技巧(由Qt documentation建议)可能是让信号处理程序写入(例如单个字节)到管道中,并且有一些线程,pr只是一些事件处理程序(例如g_io_add_watch GTK)处理字节。