我想知道如何表达像windows hook
在Linux中。

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

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

最佳答案

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

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

在捕获信号的线程中使用了信号之后,您将需要使用main的线程ID和捕获的信号编号执行pthread_kill,以将信号转发至main。问题是main将阻止它。

在转发信号之前,您不能真正取消阻塞main并阻塞信号捕获线程,因为这是一个竞争条件-没有什么可以阻止第二个信号进入并且信号捕获线程看不到它。这挫败了全部努力。

您可以让信号线程通过某种其他形式的IPC(管道或其他任何形式)向main发送一条消息,说“抓到XX,采取适当的措施”。也许足够了?

也许有人有一个聪明的主意,但我怀疑最重要的是,这不是通常在UNIX中完成的方式。

10-07 19:46
查看更多