SIGPIPE信号
来源:互联网 发布:java验证码生成 编辑:程序博客网 时间:2024/05/28 05:14
使用libevent编写websocket服务端时遇到了一个问题:
浏览器与服务端建立连接后,若刷新或关闭浏览器窗口(未监听相应事件并处理),服务端无法得知连接断开,按理说,这种情况属于client异常终止,跟拔网线的情况类似。这种情况下,服务端不知情,仍保留此连接,仍按照既定逻辑向client写数据,写了两次后,服务端程序终止(多次测试,均是第2次后终止),不是崩溃,是异常终止,非常不解。
问了一位很有经验的同事,得知是SIGPIPE信号导致程序终止。
查了相关资料,大致明白:连接建立,若某一端关闭连接,而另一端仍然向它写数据,第一次写数据后会收到RST响应,此后再写数据,内核将向进程发出SIGPIPE信号,通知进程此连接已经断开。而SIGPIPE信号的默认处理是终止程序,导致上述问题的发生。
为避免这种情况,可以选择忽略SIGPIPE信号,不执行任何动作。
#include <signal.h>//SIGPIPE ignorestruct 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
- SIGPIPE信号
- SIGPIPE信号
- SIGPIPE信号
- SIGPIPE信号
- SIGPIPE信号
- SigPipe信号
- SIGPIPE信号
- SIGPIPE信号
- SIGPIPE信号
- SIGPIPE信号
- SIGPIPE信号
- SIGPIPE信号
- SIGPIPE信号
- SIGPIPE信号
- SIGPIPE 信号
- SIGPIPE信号
- SIGPIPE信号
- [linux] SIGPIPE信号处理
- Android SQLite应用
- 数据仓库与数据挖掘
- 升级Mac OS X 和 Xcode的SVN到最新版本
- Cgroup基础知识
- pstree
- SIGPIPE信号
- 图论算法模板整理
- 转:键盘上接收一个字符,判断其是大写还是小写,是大写则将大写转换成小写,反之将小写转换成大写
- Hadoop DataNode启动之创建NameNode代理(二)
- as3 对JSON的读取和发送
- myeclipse9 jquery 报错
- 重学音标---颠覆我的听力
- 文件操作的例子
- 数据结构(5)之单链表的操作(补充)