2014-03-28 65 views
0

我有一個共享資源,表示Web服務器的請求統計信息,它在處理客戶端連接的接受調用後分叉。當某個信號被父進程捕獲時,我想將這些統計信息打印到stderr,但是統計信息結構受到信號量的保護,並且我知道由於死鎖而在信號處理程序中鎖定/解鎖信號量是個壞主意的問題。我已經嘗試在sig處理程序中設置一個標誌,並通過在accept()後首先檢查EINTR來設置標誌,然後檢查標誌但不起作用,從父進程打印統計信息。有任何想法嗎?從信號處理器中的共享資源讀取

+0

所以我似乎已經找到了解決這個問題的方法。基本上通過使用sigaction()關閉系統調用來自動重啓並檢查EINTR的accept()返回值似乎可行。 – usddddd

回答

0

您可以使用像__sync_fetch_and_add這樣的原子操作來讀取統計變量,而不是在中斷處理程序上下文中鎖定或設置標誌。

__sync_fetch_and_add(stats, 0)