![](/img/trans.png)
[英]How to make a signal interrupt sem_wait() but not terminate the process?
[英]sem_wait interrupt signal on FreeBSD
我已經注意到,在我的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);
因此,我期望線程2引發SIGINT時,它將導致sem_wait返回一個值,該循環將繼續,但是現在loopvar將為零,因此我將退出無限循環。
編輯:明確地說,我沒有使用SA_RESTART標志。
raise
引發調用線程,而不是進程的信號。 如果要發信號通知整個過程(通過傳遞給具有未屏蔽信號的隨機線程),則需要kill
函數。 如果要發信號通知特定線程,則需要pthread_kill
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.