2009-12-30 93 views
4

我有一個在Linux上運行的應用程序,捕獲信號並將它們報告給系統日誌。SIGPIPE的原因

這個應用程序頻繁地報道,沒有明顯的理由

該應用程序在後臺運行SIGPIPE事件,守護進程。信號發生在空閒時間,沒有明顯的網絡/套接字連接。應用程序經常從磁盤和DVB卡(通過內核DVB驅動程序)讀取和寫入數據。

我想找出SIGPIPE的原因。任何跟蹤信號源的方法?

編輯: 我已經加入這個代碼:

stdin = freopen("/dev/null", "r", stdin); 
stdout = freopen("/tmp/vdr_stdout", "w", stdout); 
stderr = freopen("/tmp/vdr_stderr", "w", stderr); 

仍然得到SIGPIPEs。

+0

是我的回答滿意嗎? – jldupont 2010-01-05 15:55:45

回答

4

在POSIX兼容的平臺,SIGPIPE是發送到進程的信號時,它試圖寫一個管道沒有連接到另一端的過程。

由於您指的是daemon上下文,可能STD *已關閉,並嘗試對其進行讀取/寫入操作....調試/進度報告printf可能是?

+0

是的,在一個模塊中有fprintf()。我將測試綁定stdin,stderr和stdout到臨時文件,以檢查SIGPIPE是否消失。但這需要一段時間的宕機...... – Bernd 2009-12-30 21:45:41

+0

將它們打開到'/ dev/null'是典型的。 – ephemient 2010-01-01 01:14:37

1

請問您的守護進程密切的輸入和輸出?:

fclose (stdin); 
fclose (stdout); 
fclose (stderr); 
+0

它沒有。我剛剛發現有些用例會保持這些開放。初始化部分甚至有代碼使用freopen()將stdin,stdout和stderr附加到新的控制終端。(我不使用它) – Bernd 2009-12-30 21:43:25