簡體   English   中英

sem_wait在FreeBSD上的中斷信號

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM