linux下的Boost Semaphores和EINTR返回代码

Boost Semaphores under linux and EINTR return code

本文关键字:EINTR 返回 代码 Semaphores 下的 Boost linux      更新时间:2023-10-16

在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信号灯手册上写着:

错误

  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