FreeBSD上的sem_wait中断信号

时间:2013-01-11 23:57:53

标签: c semaphore freebsd

我注意到在我的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标志。

1 个答案:

答案 0 :(得分:1)

raise引发调用线程的信号,而不是进程。如果您想要发出整个过程的信号(通过传递给信号未屏蔽的随机线程),您需要kill功能。如果要发出特定线程的信号,则需要pthread_kill