2011-10-02 71 views
0

我知道,我可以屏蔽執行處理程序時(通過使用sa_mask)引發的信號。但是,我想知道如何在更新某些全局變量時屏蔽信號。全局變量更新時的屏蔽信號

此外,我想知道如何在特定用戶定義函數執行時屏蔽信號。

可以做這兩件事嗎?

任何幫助將不勝感激

感謝

回答

0

你可以稱之爲 「信號()」 你想要的任何時間;或者a)將信號處理程序設置爲某些自定義代碼,或者b)通過將處理程序參數設置爲NULL來清除它。

sigaction(),當然,可以爲您提供更細緻的控制。您可以隨時調用sigaction(例如,在更新全局變量之前)。

此鏈接可能幫助:

http://www.linuxjournal.com/article/6483

+0

如何在執行用戶定義函數期間阻塞信號? – CuriousCoder

0

有可能與sigblock()阻止信號。當信號被解除阻塞時,阻塞的信號將排隊並釋放。

然而 - 這是非常昂貴的。你必須做一個系統調用來阻止和一個系統調用來解除阻止。如果你經常這樣做,這可能會很慢。所以有一些替代方法:

  1. 如果你在linux上,使用signalfd。您可以阻止所有信號一次並將其重定向到文件描述符,然後在安全的情況下處理它們。否則(或者如果異步信號處理很重要),您可以推遲用戶空間中的信號。在進入關鍵部分之前,設置一個volatile標誌。在你的信號處理程序中,檢查這個標誌;如果你看到它,write()pipe的信號編號並立即返回。在你的信號處理程序中,檢查這個管道上的信號,並在該點重新輸入信號。