用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

  

 

posted @ 2018-04-19 22:51  帆帆1108  阅读(225)  评论(0)    收藏  举报