2009-12-30 60 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