linux 编程中忽略SIGPIPE信号
linux 编程中忽略SIGPIPE信号
SIGPIPE
简单来说,就是客户端程序向服务器端程序发送了消息,然后关闭客户端,服务器端返回消息的时候就会收到内核给的SIGPIPE信号。
TCP的全双工信道其实是两条单工信道,client端调用close的时候,虽然本意是关闭两条信道,但是其实只能关闭它发送的那一条单工信道,还是可以接受数据,server端还是可以发送数据,并不知道client端已经完全关闭了。
以下为引用:
”’对一个已经收到FIN包的socket调用read方法, 如果接收缓冲已空, 则返回0, 这就是常说的表示连接关闭. 但第一次对其调用write方法时, 如果发送缓冲没问题, 会返回正确写入(发送). 但发送的报文会导致对端发送RST报文, 因为对端的socket已经调用了close, 完全关闭, 既不发送, 也不接收数据. 所以, 第二次调用write方法(假设在收到RST之后), 会生成SIGPIPE信号, 导致进程退出.”’
简单忽略SIGPIPE
struct sigaction action;
action.sa_handler = SIG_IGN;
sigemptyset(&action.sa_mask);
action.sa_flags = 0;
sigaction(SIGPIPE, &action, NULL);
1
2
3
4
5
sendBytes = send(Fd, Buff, readBytes, MSG_NOSIGNAL);
1
以下为一劳永逸,设置多个忽略的信号
/*****************************************************************************
* NAME: UpdateSignalHandling
*
* DESCRIPTION:
* this function sets up the signal handling and masking for the daemon
* process. the following is done here:
*
* o - change some default signal disposition with sigaction().
* o - block all signals. we will use sigwait() in a dedicated thread
* to process the signals we are interested in.
*
* the failures in this function are non-fatal. so we keep going after
* taking a note of the error code.
*
* INPUTS:
* NONE.
*
* RETURN:
* int.
*/
static
int
UpdateSignalHandling(
void
)
{
sigset_t sigset;
struct sigaction sa = { .sa_handler = SIG_IGN };
int status = 0;
if (sigfillset(&sa.sa_mask) == 0)
{
static int IGNORE_SIG[] = { SIGINT, SIGTERM, SIGCHLD, SIGHUP, SIGPIPE, SIGIO };
unsigned int i = 0;
for (i = 0; i < sizeof(IGNORE_SIG)/sizeof(IGNORE_SIG[0]); i++)
{
if (sigaction(IGNORE_SIG[i], &sa, NULL) != 0)
{
status = -errno;
}
}
}
else
{
status = -errno;
}
if (sigfillset(&sigset) == 0)
{
static int UNMASK_SIG[] = { SIGBUS, SIGFPE, SIGILL, SIGSEGV };
unsigned int i = 0;
int r = 0;
for (i = 0; i < sizeof(UNMASK_SIG)/sizeof(UNMASK_SIG[0]); i++)
{
(void)sigdelset(&sigset, UNMASK_SIG[i]);
}
/*
* per man page, the use of sigprocmask() is unspecified in MT process.
* use pthread_sigmask() instead.
*/
r = pthread_sigmask(SIG_BLOCK, &sigset, NULL);
if (r != 0)
{
status = -r;
}
}
else
{
status = -errno;
}
return status;
}
linux 编程中忽略SIGPIPE信号相关推荐
- 网络编程中的 SIGPIPE 信号
在网络编程中经常会遇到SIGPIPE信号,默认情况下这个信号会终止整个进程,当然你并不想让进程被SIGPIPE信号杀死.我们不禁会这样思考: 在什么场景下会产生SIGPIPE信号? 要怎样处理SIGP ...
- Linux 编程中的API函数和系统调用的关系【转】
转自:http://blog.chinaunix.net/uid-25968088-id-3426027.html 原文地址:Linux 编程中的API函数和系统调用的关系 作者:up哥小号 API: ...
- linux启动程序api编程,Linux编程中关于API函数与系统调用间关系
用户态xyz()函数,内核最终一般会调用形如sys_xyz()的服务例程来处理(不过也有一些例外,这里暂时不考虑) 函数xyz()是直接提供给用户编程使用的.图中"SYSCALL" ...
- 后端技术:Java编程中忽略这些细节,Bug肯定少不了
在Java语言的日常编程中,也存在着容易被忽略的细节,这些细节可能会导致程序出现各种Bug. Java语言构建的各类应用程序,在人类的日常生活中占用非常重要的地位,各大IT厂商几乎都会使用它来构建自己 ...
- Java编程中忽略这些细节,Bug肯定找上你
摘要:在Java语言的日常编程中,也存在着容易被忽略的细节,这些细节可能会导致程序出现各种Bug. 本文分享自华为云社区<Java编程中容易忽略的细节总结丨[奔跑吧!JAVA]>,作者:j ...
- 在linux系统中 下列哪些信号无法捕获,下列哪个选项不是 Linux 系统中信号的状态。...
下列哪个选项不是 Linux 系统中信号的状态. 更多相关问题 通 过 和他人的 谈话 . 观 察 市场 情况 等也 可以 获得 大量 的信 息 , 特 别 是 通过 人们 在日常生活 中 的 抱 怨 ...
- Linux编程中的坑——C++中exit和return的区别
今天遇到一个坑,折腾了一天才把这个坑填上,情况是这样的: 写了段代码,在main()函数中创建一个分离线程,结果这个线程什么都没干就直接挂掉了,代码长这样: [cpp] view plaincopy ...
- 网络编程学习笔记(SIGPIPE信号触发)
服务端代码: #include <sys/socket.h> #include <stdio.h> #include <netinet/in.h> #include ...
- 十三、linux编程中目录IO常用编程函数
概念: 索引节点,Inode是Index Node的缩写,存储于文件系统上的任何文件都可以用索引节点来表示,所以也可以说索引节点是整个linux文件系统的基础.操作系统在读取硬盘的时候不是一个块一个块 ...
最新文章
- IIS配置跨服务器迁移
- 字符类型(Java)
- C#入门篇5-6:流程控制语句 foreach
- python函数小练习
- 程序员打造个人品牌 - Personal Brand的重要性
- 剑指Offer - 面试题53 - I. 在排序数组中查找数字 I(二分查找的变形版本)
- 事务演练 mysql
- wifi情况下使用fiddler_fiddler常见的应用场景
- 深度学习 | Why and How:神经网络中的权重初始化
- 联发科天玑800适配鸿蒙系统,联发科天玑800什么水平
- Ehcache详细解读
- swiper在微信端滑动效果不友好(滑动不了)的解决方案
- 物联网卡使用过程中的注意事项
- 最大值、数据排序、九九乘法表、杨辉三角
- 加一条平行于y轴的直线_Hepco海普克应用案例—直线V型滚轮导轨广泛应用于多轴机械手...
- 三十三.智能驾驶之多传感器融合技术: AVOD融合方法
- Excel 提取单元格中的数字、中/英文方法
- MSP430F5529-基于ATK-IMU901角度传感器在UART的串口通信于数据显示
- python自定义标识符的使用区分大小写吗_Python中的标识符是不区分大小写的
- 模板匹配、抓圆、抓边、二维码 零基础labview视觉培训教程《龙哥手把手教你学视觉》只有不会教的老师,没有学不会的学生
热门文章
- PotPlayer基本使用!
- uniapp报错{errMsg: ‘request:fail‘}
- “留得下”才能 “玩得好” 度假味儿渐浓的桃花潭
- Jo音乐——歌曲下载与播放器
- redis使用布隆过滤器
- MapBox在vue环境中添加图层样式错乱,修改样式无效的问题
- java mergecells_jxl操作excle表格中mergeCells中的参数
- Jetson TX2挂载SD卡--亲测有效!
- 怎么在Linux搭建一个可以装mod的Minecraft服务器(我的世界)
- 下一个蓝海:汽车垂直电商