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 等效项是啥?