Linux Equivalent of Windows Hooks



我想知道如何表达像窗口钩子的东西在Linux中,

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

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

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

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

在信号捕获线程中消耗信号后,您需要使用main的线程id和捕获的信号号执行pthread_kill以将信号转发给main。问题是main函数会阻塞它。

你不能真正地在转发信号之前解除阻塞main并阻塞信号捕获线程,因为这是一个竞争条件——没有什么可以阻止第二个信号进入并且信号捕获线程没有看到它。这使所有的努力付诸东流。

您可以让信号线程通过其他形式的IPC(管道或其他)向主线程发送消息,说"捕获XX,采取适当的行动"。也许这就足够了?

也许有人有一些聪明的想法,但我怀疑底线是,这只是不是如何在unix中正常完成的

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