在 linux 和 EINTR return 代码下提升信号量

Boost Semaphores under linux and EINTR return code

在 boost 中(我使用 1.54.0)我看到 posix 信号量等待的实现:

inline void semaphore_wait(sem_t *handle)
{
   int ret = sem_wait(handle);
   if(ret != 0){
      throw interprocess_exception(system_error_code());
   }
}

posix 信号量手册说:

ERRORS

  EINTR  The call was interrupted by a signal handler; see signal(7).

如果我将 kill 发送到等待线程,boost 信号量会抛出异常,我说得对吗?如果是这样,你如何处理这种情况?

在我看来,这可能是 Boost.Interprocess 中的一个错误。请向开发人员报告,如果这是故意的,至少他们能够提供理由。

在上面的评论中评论信号管理建议。的确,典型的多线程应用程序应该屏蔽掉不打算由线程处理的信号,只留下一个线程来处理信号。但是,这不是强制性规则。

首先,辅助线程可以由不在内部处理信号的库生成,将其留给应用程序。可能会在这些线程中调用信号处理程序。

其次,一些信号可能有意未被屏蔽以捕获与该特定线程相关的事件。例如,可以为 SIGSEGV 注册一个处理程序来检测分段错误。该处理程序将在有问题的线程中调用,应用程序理论上可以处理该错误。同样,SIGUSR1 或 SIGUSR2 可用于向特定线程发送应用程序定义的事件信号。

最重要的是,即使设计良好的应用程序应该将信号处理提取到单独的线程中,库也不应该假设并准备好它不会。在任何情况下,抛出 EINTR 看起来都不是正确的行为。

实施看起来不错。 SA_RESTART 可以使用标志,以便自动重新启动调用。 http://man7.org/linux/man-pages/man7/signal.7.html