我注意到在我的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标志。
答案 0 :(得分:1)
raise
引发调用线程的信号,而不是进程。如果您想要发出整个过程的信号(通过传递给信号未屏蔽的随机线程),您需要kill
功能。如果要发出特定线程的信号,则需要pthread_kill
。