昨天有个程序除了问题,调试的时候发现是在SOCKET通信的时候对方关闭连接的情况下出现broken pipe错误。在网上搜索了一番,别人解释原因是向已经关闭连接的SOCKET管道写入数据造成的,但是我的程序只是在对方关闭的时候继续RECV,难道 RECV也会向管道写入数据,这个问题以后再研究吧。
知道了问题就好办了。UNIX的系统是采用信号机制向进程通知这种系统错误的,13 SIGPIPE 的默认操作是Exit,所以在程序里面写一个自己的信号处理函数,不让进程退出就OK。不过值得注意的是在截获一次信号以后,系统会把信号处理又恢复到默 认状态,所以需要再次设置。另外,对于多线程,我是在主线程里面做的信号处理,其他线程没有做,但是我理解信号是发给进程的,所以应该只要有一个线程处理 了信号就可以。
源码:
void InitSignal(void);
void handle_signal(int s) ;
/*初始化时及每次处理完时调用*/
void InitSignal(void)
{
signal(SIGPIPE,handle_signal);
}
/*信号处理函数*/
void handle_signal(int s)
{
InitSignal();
}