【发布时间】:2013-01-11 23:57:53
【问题描述】:
我注意到在我的 FreeBSD9 副本中,来自 sempahore.h 的 sem_wait 的手册页没有 EINTR 错误返回值。我目前有一些具有信号处理程序的代码,并且我正在提出一个 SIGINT 信号。这似乎没有唤醒我的 sem_wait() 所以我可以检查返回值,因此运行 sem_wait 函数的线程会无限期挂起。
根据 linux 手册页,我应该能够提高信号,测试执行 sem_wait 的线程中的 EINTR 值,但在 FreeBSD 中似乎缺少。
解决这个问题的正确方法是什么?
这就是我所拥有的伪
signal_handler() //handles SIGINT
{
loopvar = 0;
}
线程 1:
while(loopvar)
{
if((r = sem_wait())
{
check error value
continue
}
..
sem_post()
}
线程 2:
raise(SIGINT);
所以我期待当 thread2 引发 SIGINT 时,它会导致 sem_wait 返回一个值,循环将继续,但现在 loopvar 将为零,所以我将退出我的无限循环。
编辑:要清楚,我没有使用 SA_RESTART 标志。
【问题讨论】: