Linux下socket编程write()函数崩溃导致进程退出

转载 2015年11月18日 20:03:33

问题描述:

当服务器close一个连接时,若client端接着发数据。根据TCP协议的规定,会收到一个RST响应,client再往这个服务器发送数据时,系统会发出一个SIGPIPE信号给进程,告诉进程这个连接已经断开了,不要再写了。

又或者当一个进程向某个已经收到RSTsocket执行写操作是,内核向该进程发送一个SIGPIPE信号。该信号的缺省学位是终止进程,因此进程必须捕获它以免不情愿的被终止。

我遇到的情况是客户端socket句柄已关闭,然后服务器像一个已关闭的客户端连接句柄中执行写操作,从而产生了SIGPIPE信号。

问题原因:

根据信号的默认处理规则SIGPIPE信号的默认执行动作是terminate(终止、退出),所以进程会退出。

系统里边定义了三种处理方法: 
    1)SIG_DFL     
    2)SIG_IGN     
    3)SIG_ERR     

根据信号的默认处理规则SIGPIPE信号的默认执行动作是terminate(终止、退出),所以进程会退出。若不想客户端退出,需要把 SIGPIPE默认执行动作屏蔽

问题解决:

将SIGPIPE的默认处理方法屏蔽,我找到了两种方法:用signal(SIGCHLD,SIG_IGN)或者重载其处理方法。个人选了后者。两者区别在于signal设置的信号句柄只能起一次作用,信号被捕获一次后,信号句柄就会被还原成默认值了;sigaction设置的信号句柄,可以一直有效,值到你再次改变它的设置。具体代码如下:

struct sigaction action;

action.sa_handler = handle_pipe;

sigemptyset(&action.sa_mask);

action.sa_flags = 0;

sigaction(SIGPIPE, &action, NULL);

void handle_pipe(int sig)

{//不做任何处理即可}

在源文件中要添加signal.h头文件:#include <signal.h>。

linux C语言 SOCKET 服务器断开导致客户端SEND崩溃问题解决办法

原文来自:http://blog.chinaunix.net/uid-24830931-id-3786670.html 一、现象描述 在利用librdkafka同kafka broker通...
  • newsyoung1
  • newsyoung1
  • 2016年03月03日 20:10
  • 4625

Linux下socket编程write()函数崩溃导致进程退出

Linux下socket编程write()函数崩溃导致进程退出  (2012-12-18 17:24:36) 转载▼ 标签:  socket   l...
  • machiner1
  • machiner1
  • 2014年09月01日 16:32
  • 1694

TCP socket异常关闭总结

游戏测试过程中发现某些socket错误经常出现,以下是测试游戏服务器时通常考虑的case. 服务器端: 1. Case:客户端程序正常运行的情况下,拔掉网线,杀掉客户端程序 目的:模拟客户端死机、系统...
  • u012841800
  • u012841800
  • 2014年03月06日 22:11
  • 4347

Linux下Socket编程之read、write、send、recv函数的比较

建立好了TCP连接之后,我们就可以把得到的套接字当做文件描述符来使用,由此,想到了网络程序里面的基本的读写函数read和write函数。 Write函数 Ssize_t write(int...
  • imxiangzi
  • imxiangzi
  • 2016年01月06日 23:16
  • 1985

Linux网络编程(附1)——封装read、write

由于网络IO传输过程中网络环境的复杂性,read、write有可能遇到中断信号等中断,而且简单的read、write版本并不能直接控制到底read、write多长的字节,所以可以对其进行封装。...
  • sshhiixx
  • sshhiixx
  • 2015年08月12日 02:05
  • 1379

Linux下进程崩溃时定位源代码位置

在Linux系统下,进程可能由于各种原因崩溃,此时我们要找到出问题的源代码在某一个文件的具体行号,这样调试起来就会方便,高效很多。下面是解决问题的思路和步骤以及自己的一些想法   解决该问题的...
  • twtydgo
  • twtydgo
  • 2016年06月03日 14:01
  • 1415

linux 遭遇SIGPIPE信号,导致进程退出的问题

当服务器close一个连接时,若client端接着发数据。根据TCP协议的规定,会收到一个RST响应,client再往这个服务器发送数据时,系统会发出一个SIGPIPE信号给进程,告诉进程这个连接已经...
  • u012398613
  • u012398613
  • 2016年08月25日 20:36
  • 423

Socket通信之Write实现流程

1 分析write在进程间通信的实现过程        在内核中,socket是与文件指针挂钩的,因此就可以通过open、read、write像操作文件一样对socket进行操作;而write的过程相...
  • guodong1010
  • guodong1010
  • 2016年03月27日 23:42
  • 610

网络编程(24)—— linux中write和read函数的阻塞试验

刚刚接触网络编程时,很容易被客户端和服务器之间的交互搞晕,例如各种函数的阻塞和非阻塞就让人头疼。例如在我的印象中linux中用于用于对文件描述符进行读写的write()函数和read()函数是非阻塞函...
  • lzhui1987
  • lzhui1987
  • 2016年10月31日 08:15
  • 2836

Linux下socket编程之多进程TCP服务器端

代码如下: tcp_server.c#include #include #include #include #include #include #include static void usage(...
  • lishitao_578
  • lishitao_578
  • 2017年06月03日 14:36
  • 230
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Linux下socket编程write()函数崩溃导致进程退出
举报原因:
原因补充:

(最多只允许输入30个字)