Linux

為什麼 printf 不是 asyc 信號安全功能?

  • September 15, 2020

我們知道這printf不是非同步信號安全功能。以下是我的基本理解:

假設我們呼叫printf了 inmain方法,因此內容被寫入 stdio 緩衝區,就在緩衝區刷新到文件之前,信號到達並且信號處理程序也呼叫printf,第二個printf將其內容附加到緩衝區,現在是緩衝區有來自第一次呼叫和第二次呼叫的內容,不一致,這是不正確的,因此我們不能在信號處理程序中使用非 asyc 安全函式。我的理解正確嗎?

如果我的理解是正確的,那麼非同步安全功能如何解決這個問題?因為safe函式還需要處理buffer,裡面還可能包含珍貴的call的buff數據?

printf是非非同步信號安全的,因為正如您所描述的,它最終會在沒有同步的情況下操縱全域狀態。為了增加樂趣,它不一定是可重入的。在您的範例中,信號可能在第一個printf執行時被處理,而第二個printf可能會弄亂第一個呼叫的狀態。

推薦的非同步信號安全方法是讓信號處理程序在某處設置一個標誌,並讓主程序流程處理該標誌。這避免了重入、序列化輸出的問題,並有助於保持信號處理程序的速度。

引用自:https://unix.stackexchange.com/questions/609210