用rpcgen生成的基于RPC的VXII程序,客户端异常关闭时导致服务端退出进程。
问题起源: 上位机连续读数据过程中杀掉上位机进程,导致下位机异常退出进程。
原因有两点:
1、默认情况下对SIGPIPE信号的处理方法是结束进程。
2、socket客户端关闭后,服务端仍然在给它发送数据,第一次调用write时产生RST,第二次调用write会生成SIGPIPE信号。
解决方法:
在RPC线程中屏蔽SIGPIPE信号。
vxi11thread::vxi11thread() { setStackSize(128*1024); setObjectName("vxi11"); /*! [dba: 2018-04-19] bug:2753 * SIGPIPE的默认处理方式是杀掉进程,这里将其在线程中屏蔽掉.*/ sigset_t signal_mask; sigemptyset (&signal_mask); sigaddset (&signal_mask, SIGPIPE); int rc = pthread_sigmask (SIG_BLOCK, &signal_mask, NULL); if (rc != 0) { printf("block sigpipe error\n"); } }
问题发现过程:
一开始怀疑指针被提前释放导致,反复查找各个节点指针没问题。
后来用GDB调试时发现程序崩溃时弹出了SIGPIPE信号,顺藤摸瓜!
感谢这篇文章:
http://www.xuebuyuan.com/2211707.html

浙公网安备 33010602011771号