【问题标题】:How to stop poll() from being interrupted by a specific signal如何阻止 poll() 被特定信号中断
【发布时间】:2015-09-01 18:23:54
【问题描述】:

我有一个 C 应用程序使用 poll 来等待一些数据。

目前我正在将我的应用程序的其余部分实现到这个应用程序中,并且我使用基于时间的中断 (SIGRTMIN)。如果我的其他计时器之一回调,则如预期的那样 poll() 返回。

如何阻止民意调查这样做?我正在阅读很多关于 ppoll() 的内容,但不知道如何使用它...我可以使用它来阻止此函数在触发计时器事件时返回吗?

(投票延迟几毫秒我没有任何问题)

【问题讨论】:

  • 使用sigprocmask()(或pthread_sigmask(),用于多线程程序)查找当前信号掩码,sigaddset() 是您要在[p]poll() 期间阻塞的信号,然后在调用poll() 之前将信号掩码传递给ppoll()sigprocmask()/pthread_sigmask(),并接受将存在竞争条件。

标签: c linux timer signals


【解决方案1】:

如果poll() 中阻塞的线程/进程接收到未阻塞信号,则poll() 被中断。如果您不希望这种情况发生,那么您可以在调用poll() 之前阻止所需的信号,然后在poll() 返回后取消阻止它(参见sigprocmask())。但是请注意,这不会导致poll() 被延迟——恰恰相反。如果有的话,它将导致信号的接收延迟。如果poll() 阻塞的时间足够长,那么它可能会导致多个 RT 信号排队,因此在您取消阻塞该信号后,您会快速连续接收多次。

您应该考虑改为检查poll() 的返回值(无论如何您都应该这样做)并重试是否是EINTR

【讨论】:

  • 由于信号屏蔽的使用会屏蔽整​​个应用程序,因此其他计时器也不会中断,我决定在轮询周围放置一段时间并在其周围添加一组计时器。我在一段时间之前得到了时间戳,在这段时间里我得到了另一个时间戳。如果这些计时器之间的差异超过了轮询的超时时间,我会打破这个时间,以及如果轮询已被取消并且有可用的东西 (POLLIN)。
  • 用户空间中的轮询处理程序是否在中断上下文中完成?
猜你喜欢
  • 2019-04-25
  • 1970-01-01
  • 2015-12-14
  • 1970-01-01
  • 2017-01-01
  • 2020-10-05
  • 2015-11-27
  • 2011-12-15
  • 2016-10-07
相关资源
最近更新 更多