SIGPIPE信号

转载 2013年12月03日 16:23:25
使用libevent编写websocket服务端时遇到了一个问题:

浏览器与服务端建立连接后,若刷新或关闭浏览器窗口(未监听相应事件并处理),服务端无法得知连接断开,按理说,这种情况属于client异常终止,跟拔网线的情况类似。这种情况下,服务端不知情,仍保留此连接,仍按照既定逻辑向client写数据,写了两次后,服务端程序终止(多次测试,均是第2次后终止),不是崩溃,是异常终止,非常不解。

问了一位很有经验的同事,得知是SIGPIPE信号导致程序终止。

查了相关资料,大致明白:连接建立,若某一端关闭连接,而另一端仍然向它写数据,第一次写数据后会收到RST响应,此后再写数据,内核将向进程发出SIGPIPE信号,通知进程此连接已经断开。而SIGPIPE信号的默认处理是终止程序,导致上述问题的发生。

为避免这种情况,可以选择忽略SIGPIPE信号,不执行任何动作。

#include <signal.h>
//SIGPIPE ignore
struct sigaction act;

act.sa_handler = SIG_IGN;

if (sigaction(SIGPIPE, &act, NULL) == 0) {
    LOG("SIGPIPE ignore");

}


转载请注明出处 http://www.cnblogs.com/caosiyang/archive/2012/07/19/2599071.html

相关文章推荐

Linux下服务器遭遇SIGPIPE信号

我写了一个服务器程序,在Linux下测试,然后用C++写了客户端用千万级别数量的短链接进行压力测试.  但是服务器总是莫名退出,没有core文件. 最后问题确定为, 对一个对端已经关闭的socket...

SIGPIPE信号详解

SIGPIPE信号详解 当服务器close一个连接时,若client端接着发数据。根据TCP协议的规定,会收到一个RST响应,client再往这个服务器发送数据时,系统会发出一个SIGPIPE信...

SIGPIPE信号

原文 我写了一个服务器程序,在Linux下测试,然后用C++写了客户端用千万级别数量的短链接进行压力测试.  但是服务器总是莫名退出,没有core文件. 最后问题确定为, 对一个对端已经关...

关于SIGPIPE信号

我写了一个服务器程序,在Linux下测试,然后用C++写了客户端用千万级别数量的短链接进行压力测试. 但是服务器总是莫名退出,没有core文件. 最后问题确定为, 对一个对端已经关闭的socke...

send或者write socket遭遇SIGPIPE信号

send或者write socket遭遇SIGPIPE信号(转) 转自:http://linux.chinaunix.net/techdoc/net/2008/10/10/1037290.shtml...

send或者write socket遭遇SIGPIPE信号

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

Socket数据发送中信号SIGPIPE及相关errno的研究

Socket数据发送中信号SIGPIPE及相关errno的研究 好久没做过C开发了,最近重操旧业。 听说另外一个项目组socket开...

关于SIGPIPE信号

我写了一个服务器程序,在Linux下测试,然后用C++写了客户端用千万级别数量的短链接进行压力测试.  但是服务器总是莫名退出,没有core文件. 最后问题确定为, 对一个对端已经关闭的sock...

SIGPIPE信号详解

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

iOS开发socket程序被SIGPIPE信号Terminate的问题

以前在iphone上写socket的程序的时候,如果尝试send到一个disconnected socket上,就会让底层抛出一个SIGPIPE信号。 client端通过 pipe 发送信息到se...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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