我注意到在我的 FreeBSD9 副本中,来自 sempahore.h 的 sem_wait 的手册页没有 EINTR 错误返回值。我目前有一些具有信号处理程序的代码,并且我正在发出 SIGINT 信号。这似乎并没有唤醒我的 sem_wait() 所以我可以检查返回值,因此使用 sem_wait 运行函数的线程被无限期挂起。
根据 linux 手册页,我应该能够提高信号,测试执行 sem_wait 的线程中的 EINTR 值,但这似乎在 FreeBSD 中缺失。
解决此问题的正确方法是什么?
在psuedo这就是我所拥有的
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 标志。