linux下的Boost Semaphores和EINTR返回代码
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信号灯手册上写着:
错误
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
相关文章:
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- 什么时候在C++中返回常量引用是个好主意
- 你能重载对象变量名本身返回的内容吗
- 为什么 Serial.println(<char[]>);返回随机字符?
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- 如何获取std::result_of函数的返回类型
- QueryWorkingSet总是返回false
- (C++)分析树以计算返回错误值的简单算术表达式
- 访问者访问变体并返回不同类型时出错
- 如何返回一个类的两个对象相加的结果
- OpenInventor从9.8升级到10.4.2后,GLSL纹理返回零
- lower_bound()返回最后一个元素
- "throw expression code" 1e7 >返回 d 是什么?投掷标准::overflow_error( "too big" ) : d;意味 着?
- 奇怪的(对我来说)返回声明 - 在谷歌上找不到任何关于它的信息
- 如何取消对nullptr的屏蔽,返回正确的对象
- 奇怪的结构&GCC&clang(void*返回类型)
- 架构决策:返回std::future还是提供回调
- 从python中调用C++函数并获取返回值
- 设置SO_RCVTIMEO时,为什么recv返回-1并且errno=EINTR
- linux下的Boost Semaphores和EINTR返回代码