zoukankan      html  css  js  c++  java
  • linux网络编程中需要注意的信号SIGPIPE

      在调试cs时,s端循环收,c端循环发,s端意外崩溃后,c端自动退出,终端提示SIGPIPE导致c端退出。man 7 signal:

    SIGPIPE      13      Term    Broken pipe: write to pipe with no readers

      SIGPIPE发生在:写一个没有读的管道,默认动作是终止程序。man 2 write:

    EPIPE  fd is connected to a pipe or socket whose reading end is closed.
                  When this happens the writing process will also receive  a  SIG-
                  PIPE  signal.  (Thus, the write return value is seen only if the
                  program catches, blocks or ignores this signal.)

      write的错误码EPIPE发生在写的fd对应的pipe或者socket对端的读端关闭了时。写操作的返回值仅当程序捕获,阻塞,忽略此信号时才能收到,因为SIGPIPE默认会终止程序。

      有一个细节,使用gdb单步调试c端,在开始write前,手动终止s端,c端收到s的FIN分节,并回复ack,c端处于CLOSE_WAIT状态,此时,c端的write操作返回的数值是正常的,socket状态不存在了,wireshark抓包会发现一个RST包,表示socket连接已重置,再次write,将会立即收到SIGPIPE。准确的讲,写一个已经明确知道对端关闭的socket,会收到对端发送的一个RST分节,再次写此socket,会产生SIGPIPE。

      一般出现SIGPIPE的情况有:

      1.write一个未connect的socketxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

  • 相关阅读:
    abstract关键字
    final关键字
    Vue使用枚举类型实现HTML下拉框
    第八节 pandas读取和保存文件
    第七节 pandas新建数据框的两种方式
    第六节 numpy的常用属性和方法
    第五节 numpy的简单使用
    第三节 matplotlib绘制直方图
    第三节 matplotlib绘制条形图
    第二节 matplotlib绘制散点图
  • 原文地址:https://www.cnblogs.com/thammer/p/7103065.html
Copyright © 2011-2022 走看看