簡體   English   中英

我可以檢查待處理的信號並立即執行它們

[英]Can I check for pending signals and execute them immediately

我想要做的是只處理代碼中某些已知點的信號。 因此,在這些點上,我將檢查待處理的信號並立即執行其處理程序。

我知道我可以使用sigprocmask阻塞信號然后解鎖它,但是這樣,信號將在解鎖后的任何時間點傳遞,這是我不想要的。 我想在我的代碼中的特定位置精確地執行信號處理程序。 換句話說,我想讓信號處理同步。

有沒有辦法實現我想做的事情?

您可以使用sigwait系列的系統調用來獲取任何掛起的阻塞信號。 不可能同時等待信號和其他類型的事件,如果你不想在sigwait中阻塞,你可以先使用sigpending檢查是否有待處理的信號。

如果您正在為應用程序使用事件驅動設計,那么在運行循環中通常會有幾個fds。 對於這種情況,您應該使用寫入pipe的信號處理程序。 信號將以異步方式傳送,但隨后會出現在您的運行循環中,只是需要處理的另一個fd。

如果我理解正確,您只需使用sigwait清除每個待處理信號,然后直接調用您的信號處理函數。

在代碼中要處理和清除待處理信號的位置,您可以使用sigpending檢查是否有信號等待,然后重復調用sigwait以清除待處理信號,手動調用信號處理函數以執行所需操作。

當您取消屏蔽它們時,將立即傳遞任何待處理信號。 只需在要傳遞它們的位置取消屏蔽/重新屏蔽即可。 如果您正在使用線程,請注意異步信號(如您從kill獲得的信號)可以轉到任何已解除阻塞的線程。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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