2015-12-25 37 views
1

有沒有一種方法可以在信號處理程序中調用非異步安全功能?或者這是不可能的?信號處理程序異步安全功能

我不是在尋找從信號處理程序中設置一個標誌,然後打印在我的「主代碼」的東西,但在這種情況下,信號處理程序將定義本身就是我的程序的邏輯流程。

+0

「*有沒有一種方法可以在信號處理程序中調用非異步安全函數?*」不,至少不是以安全的方式。 – alk

回答

2

從技術上講,你可以在信號處理程序內調用或寫入任何函數,但沒有任何東西阻止你這樣做。

爲什麼它的泄氣的原因是,當信號處理程序處理您的操作,有可能是提出了另一個信號,這可能使信號處理程序跳轉到更高的優先級信號處理程序。

這種導線的種族和難以調試的問題,因爲我們不知道的信號處理順序的。

這就是爲什麼信號處理程序應該是輕的,以避免難以調試競爭條件,通常我們設置標誌來指示信號已被提出並在讀取這些標誌的主線程或另一線程中處理它。

4

有沒有辦法可以撥打從信號處理程序中獲取異步安全功能?或者這是不可能的?

不,不是安全。這樣做會導致未定義的行爲 - 很可能是死鎖,但其他事情也可能發生。

的原因,任何函數調用標記爲「異步信號安全」是其標記爲安全地從信號處理程序中調用的真正目的。

signal(7) Linux man page

異步信號安全功能

的信號處理函數必須非常小心,因爲處理 其他地方可能在某個任意點在執行 被打斷的程序。 POSIX具有「安全功能」的概念。如果 信號中斷不安全功能的執行,並且處理程序 調用不安全功能,則程序的行爲爲 未定義。

POSIX.1-2004(又稱POSIX.1-2001技術勘誤2) 要求的實現,以保證以下功能 可以安全地調用一個訊號處理器中:

...

如果函數調用沒有列出,這不是安全地從信號處理程序中調用它。

+0

對不起,我的意思是非異步安全功能! – Curious

+0

@Curious - 修正。 –