首页 > 我的观点, 程序人生 > 由SIGPIPE导致程序退出想到的

由SIGPIPE导致程序退出想到的

这几天在写一个发送快照的客户端,写好后测试。刚开始,启动服务端,客户端启动,开始发送快照页面。观察数据,结果,一切正常。基本功能实现了。今天早上,想到如果服务端关闭,客户端的状态会怎么样呢?产生了这个想法,就马上来try一下,结果客户端程序直接退出了,也没有产生core dump文件。很诡异! 于是gdb之,发现是产生了信号SIGPIPE,恩这下明白了。服务端关闭的时候,客户端正在发数据,把数据发送到了已经关闭的socket上,当然会产生SIGPIPE了。而SIGPIPE的缺省处理方式是terminate,就是直接退出程序,所以解决的方法就是改变SIGPIPE的handler。下面是改变的代码:

struct sigaction sa;
sa.sa_handler = SIG_IGN;
sigaction( SIGPIPE, &sa, 0 );

通过上述代码可以看出,处理的方法就是:把SIGPIPE的handler改为SIG_IGN, 而SIG_IGN是个什么东东呢?慢慢听我说来。SIG_IGN,简单的说,就是忽略信号,用比较专业的话来说,就是在一个信号处理函数,它在信号触发时,什么都不做,是一个空的函数。

综合这几天上面的体会和这几天写代码,调程序时的一些体会,得到以下几点体会:

1.写程序,保证程序正确的功能很重要,但是异常状态的跟踪与处理也是非常重要的,一定要考虑周全。

2.调程序,用gdb定位后,不能死盯着那个位置,还是在“瞻前顾后”的,看一下定位的位置周围的程序,这样会看的比较全面一些。

3.写每一个代码,调每一个程序,解决每一个问题,都要“多想”,都要反思,这样才会有进步。

  1. 本文目前尚无任何评论.
  1. 本文目前尚无任何 trackbacks 和 pingbacks.
您必须在 登录 后才能发布评论.