我有SIGINT
處理程序。它爲整個程序設置變量:errflag
。當我做select()
,它通過SIGINT
中斷,我檢查errflag
,看看它是否是SIGINT
(有自己的常數分配到errflag
)。但是,處理程序可能會晚,errflag
尚未設置。如何在處理程序的errflag
解決方案之前推遲處理?或者如何正確實施?如何確保信號處理程序完成,然後才繼續程序?
此外,在一個代碼路徑select()
返回-1
上Ctrl-C鍵,errno
是EINTR
。這裏處理程序永遠不會遲到在其他路徑select()
返回-1
,errno
也是EINTR
,但處理程序稍後輸出日誌消息並且遲到,我的errflag
檢查已經執行。
正如第一個答案中指出的那樣,中斷會停止當前處理並運行處理程序,如果處理程序返回,則重新啓動系統調用或將errno設置爲EINTR來中斷它。你使用'signal()'還是'sigaction()'?如果沒有你的代碼,很難看到發生了什麼問題,但是你的解釋是信號處理程序可以被「推遲」,這基本上是錯誤的。使用'sigaction()',您可以在處理另一個信號'sa_mask'時阻塞一個信號,但當第一個處理程序返回時將阻止信號。 –
@JonathanLeffler:你是對的,信號是通過隊列機制手動延遲的,並且處理程序提前返回,在此之前沒有調試打印,並將來自隊列的調用解釋爲第一個,最後一個調用。 – Itzie
所以,你有一個信號處理器有兩個或更多的退出路線,一個有診斷打印,另一個沒有?輕鬆完成 - 但也需要注意。這可能導致對結果的嚴重誤解。 「單次進入,單次退出」編程的(少數)優點之一就是你不會遇到這個問題! –