Windows 挂钩的 Linux 等效项

Posted

技术标签:

【中文标题】Windows 挂钩的 Linux 等效项【英文标题】:Linux Equivalent of Windows Hooks 【发布时间】:2011-11-01 01:32:18 【问题描述】:

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

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

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

【问题讨论】:

【参考方案1】:

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

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

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

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

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

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

【讨论】:

【参考方案2】:

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

【讨论】:

以上是关于Windows 挂钩的 Linux 等效项的主要内容,如果未能解决你的问题,请参考以下文章

Linux Shell 中的 ` +` 的 Windows 等效项是啥?

VirtualProtectEx 的 Linux 等效项?

Linux 的 PInvoke GetWindowRect 等效项

IIS 上的 Linux shell 等效项

GCC 的调试堆/STL 调试等效项?

RTC SCM 中的 Git 钩子等效项