我想知道如何在Linux中expression一个像windows挂钩的东西。
我有一个Linux应用程序与各种线程。 当前为ctrl c安装了一个信号处理程序的主线程捕获它并closures应用程序。
我想要应用程序中的另一个线程先处理ctrl c事件,然后传递给主线程。
据我所知,这将是棘手的。 Unix信号是原始的。
信号默认传递给随机线程。 为了解决这个问题,通常使用的技巧是阻止除一个之外的所有线程中的信号。 最简单的方法是用pthread_sigmask
来阻塞main中的所有信号,然后创建线程(它将继承信号掩码),然后有一个单独的线程在阻塞的信号上执行sigwait/sigwaitinfo
。 这迫使信号传递到该线程。
在信号捕捉线程中消耗掉信号之后,你需要用主线程的id和被捕获的信号数做一个pthread_kill
来把信号转发到main。 问题是主要会阻止它。
在转发信号之前,您不能真正解锁主信号并阻塞信号捕捉线程,因为这是一个竞争条件 – 没有任何东西阻止第二个信号进入,信号捕捉线程也没有看到它。 这完全失败了。
你可以让信号线程通过其他形式的IPC(管道或其他)发送一条消息给主要的,说“抓住XX,采取适当的行动”。 也许这是足够的?
也许有人有一个聪明的想法,但我怀疑底线是,这不是通常如何在Unix中完成。
另一个技巧(由Qt文档建议)可能是将一个信号处理程序(例如单个字节)写入一个管道,并且有一些线程,只是一些事件处理程序(例如带有GTK的g_io_add_watch )处理该字节。