gpt4 book ai didi

c - FreeBSD 上的 sem_wait 中断信号

转载 作者:行者123 更新时间:2023-11-30 15:52:36 26 4
gpt4 key购买 nike

我注意到,在我的 FreeBSD9 副本上,sempahore.h 中 sem_wait 的手册页没有 EINTR 错误返回值。我目前有一些具有信号处理程序的代码,并且我正在引发 SIGINT 信号。这似乎并没有唤醒我的 sem_wait(),因此我可以检查返回值,因此运行带有 sem_wait 的函数的线程会无限期挂起。

根据linux手册页,我应该能够提高singal,测试执行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 标志。

最佳答案

raise 为调用线程而不是进程引发信号。如果您想向整个进程发出信号(传递到未屏蔽信号的随机线程),则需要 kill 函数。如果您想向特定线程发出信号,则需要 pthread_kill

关于c - FreeBSD 上的 sem_wait 中断信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14288580/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com