SIGPIPE并产生一个信号处理

简介:

阅读TCP某物,知道server并关闭sockfd当写两次,会产生SIGPIPE信号,假如不治疗,默认将挂起server

弄个小样本试验:

#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <fcntl.h>
#include <sys/wait.h>
#include <netinet/in.h>
#include <errno.h>
#include <signal.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <signal.h>
#define ERR_EXIT(m) \
    do { \
        perror(m);\
        exit(EXIT_FAILURE);\
    }while(0)

void handle(int arg)
{
    printf("sigpipe\n");
}
int main(int argc, const char *argv[])
{
    signal(SIGPIPE, handle);//SIGPIPE信号的处理
    int sockfd = socket(AF_INET, SOCK_STREAM, 0);
    if(sockfd == -1)
        ERR_EXIT("socket");
    struct sockaddr_in seraddr;
    seraddr.sin_family = AF_INET;
    seraddr.sin_port = htons(8888);
    seraddr.sin_addr.s_addr = inet_addr("127.0.0.1") ;
    socklen_t len = sizeof(seraddr);
    if(-1 == (bind(sockfd, (struct sockaddr*)&seraddr, len)))
        ERR_EXIT("bind");
    if(listen(sockfd, 3) == -1)
        ERR_EXIT("listen");

    int clientfd = accept(sockfd, NULL, NULL);
    printf("client\n");
    while(1)
    {
        sleep(3);
        printf("hello\n");
        write(clientfd, "hello", sizeof("hello"));
    }
    return 0;
}

client使用telnet连接

发现:

   当client关闭后,server端还会写两次后。就会收到SIGPIPE信号,兴许继续会收到此信号

telnet localhost 8888

--》client:

  

syswj@host ~]$ telnet localhost 8888
Trying ::1...
telnet: connect to address ::1: Connection refused
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
hello
hello
hello
^]
telnet> Connection closed.

   server信息:

  

  mianshi git:(master)  ./a.out 
client
hello
hello
hello
hello   //-》对方会发送一个RST复位报文
hello
sigpipe   
hello
sigpipe    //-->是因为write导致的
hello
sigpipe
hello
sigpipe
^C

能够看到是在client关闭后,再发送 第2个信息后才收到的SIFPIPE信号

兴许发送仍然会收到SIGPIPE信号

       




版权声明:本文博客原创文章。博客,未经同意,不得转载。






本文转自mfrbuaa博客园博客,原文链接:http://www.cnblogs.com/mfrbuaa/p/4718496.html,如需转载请自行联系原作者


相关文章
|
5月前
|
Unix Linux C++
c++信号处理
c++信号处理
46 0
|
11月前
|
存储 安全 Unix
ECF机制:信号处理
ECF机制:信号处理
58 0
|
5月前
|
存储 Linux 编译器
Linux进程信号【信号处理】
Linux进程信号【信号处理】
84 0
|
机器学习/深度学习 传感器 算法
【雷达信号分析】基于单载频矩形脉冲信号时频分析附Matlab代码
【雷达信号分析】基于单载频矩形脉冲信号时频分析附Matlab代码
|
4月前
信号处理与 signal.h 库
信号处理与 signal.h 库
|
5月前
|
机器学习/深度学习
基于DSP的音频信号处理
基于DSP的音频信号处理
255 2
|
11月前
|
存储 NoSQL Linux
C++信号的使用
C++信号的使用
92 0
|
12月前
信号处理与信号产生电路
信号处理与信号产生电路是指用于处理和产生电信号的电路。这些电路可以对输入信号进行滤波、放大、调制、解调、变换等操作,以实现对信号的处理和生成。
87 0
|
算法 定位技术
【信号处理】卡尔曼滤波(Matlab代码实现)
【信号处理】卡尔曼滤波(Matlab代码实现)
136 0
|
机器学习/深度学习 传感器 编解码
基于matlab实现TDM-MIM雷达信号处理
基于matlab实现TDM-MIM雷达信号处理