现在的位置: 首页 > web前端 > 正文

c linux下产生SIGPIPE原因

2020年07月15日 web前端 ⁄ 共 792字 ⁄ 字号 评论关闭

  Brokenpipe:writetopipewithnoreaders.管道破裂。这个信号通常在进程间通信产生,比如采用FIFO(管道)通信的两个进程,读管道没打开或者意外终止就往管道写,写进程会收到SIGPIPE信号。此外用Socket通信的两个进程,写进程在写Socket的时候,读进程已经终止。


  SIGPIPE(Brokenpipe)含义


  其他信号含义,参见:


  linux信号类别/列表-概述


  解决方法


  忽略SIGPIPE信号


  structsigactionsa;


  sa.sa_handler=SIG_IGN;


  sigaction(SIGPIPE,&sa,0);


  123


  调整socket发送函数的flags参数


  设置flags为MSG_NOSIGNAL,实现整个进程(而非仅仅调用的线程)忽略SIGPIPE信号的效果.


  ssize_tsend(intsockfd,constvoid*buf,size_tlen,intflags);


  ssize_tsendto(intsockfd,constvoid*buf,size_tlen,intflags,\


  conststructsockaddr*dest_addr,socklen_taddrlen);


  ssize_tsendmsg(intsockfd,conststructmsghdr*msg,intflags);


  1234


  sigpipe参数


  参数flags,指示了send的传输数据的方式:


  MSG_CONFIRM提供链路层反馈以保持地址映射有效


  MSG_DONTROUTE勿将数据包路由出本地网络


  MSG_DONTWAIT允许非阻塞行为


  MSG_EOF标记记录结束


  MSG_MORE允许延迟并写更多数据


  总之,sigpipe给大家简单的介绍了一些,希望大家多看看。


  

抱歉!评论已关闭.