0

我正在寻找一种方法,从信号处理程序中,有条件地中断系统调用,这种方式在处理信号时发生。具体来说,假设一个调用read正在处理中,并且SIGRT0被接收到。使用此信号处理程序SA_RESTART是因为它不想无条件地中断系统调用,但根据条件,我希望在信号处理程序read返回后EINTR立即返回。

我可以做到这一点的一种方法是为 设置另一个信号处理程序SIGRT1,为 的处理程序放入SIGRT1信号掩码,然后从处理程序SIGRT0中省略。然后处理程序can ,当第一个非中断信号处理程序返回时,第二个将触发并被中断。SA_RESTARTSIGRT1SIGRT0raise SIGRT1read

此解决方案的问题是其他进程可能会发送SIGRT1,从而导致意外EINTR发生。

有什么办法可以达到我想要的结果吗?

4

2 回答 2

0

如果您想设置一个特定的进程来发送该信号,那么您可以使用任何 IPC 技术(例如管道)来共享其 pid id 和标志,以确保该信号是由该进程发送的。如果进程未发送信号,则忽略它。

于 2011-03-22T07:32:00.273 回答
0

由于多种原因,我想要的东西是不可能的。也许最重要的是,一旦第一个信号处理程序返回但在被中断的系统调用重新启动之前,打算进行中断的辅助信号可能(实际上在大多数系统上)会触发。然后系统调用将重新启动并继续阻塞。

也许更重要的是,任何EINTR有意中断阻塞系统调用的尝试都会受到竞争条件的影响,即信号在阻塞系统调用之前到达,但在任何检查之后会因为收到信号而阻止进行系统调用。唯一可以接受的情况是,当您准备发射多个信号时,它们之间的延迟会增加,直到“中断请求”被兑现,但这已经进入了片状黑客的领域......

于 2012-02-28T14:46:07.980 回答