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信号相关推荐

  1. 网络编程中的 SIGPIPE 信号

    在网络编程中经常会遇到SIGPIPE信号,默认情况下这个信号会终止整个进程,当然你并不想让进程被SIGPIPE信号杀死.我们不禁会这样思考: 在什么场景下会产生SIGPIPE信号? 要怎样处理SIGP ...

  2. Linux 编程中的API函数和系统调用的关系【转】

    转自:http://blog.chinaunix.net/uid-25968088-id-3426027.html 原文地址:Linux 编程中的API函数和系统调用的关系 作者:up哥小号 API: ...

  3. linux启动程序api编程,Linux编程中关于API函数与系统调用间关系

    用户态xyz()函数,内核最终一般会调用形如sys_xyz()的服务例程来处理(不过也有一些例外,这里暂时不考虑) 函数xyz()是直接提供给用户编程使用的.图中"SYSCALL" ...

  4. 后端技术:Java编程中忽略这些细节,Bug肯定少不了

    在Java语言的日常编程中,也存在着容易被忽略的细节,这些细节可能会导致程序出现各种Bug. Java语言构建的各类应用程序,在人类的日常生活中占用非常重要的地位,各大IT厂商几乎都会使用它来构建自己 ...

  5. Java编程中忽略这些细节,Bug肯定找上你

    摘要:在Java语言的日常编程中,也存在着容易被忽略的细节,这些细节可能会导致程序出现各种Bug. 本文分享自华为云社区<Java编程中容易忽略的细节总结丨[奔跑吧!JAVA]>,作者:j ...

  6. 在linux系统中 下列哪些信号无法捕获,下列哪个选项不是 Linux 系统中信号的状态。...

    下列哪个选项不是 Linux 系统中信号的状态. 更多相关问题 通 过 和他人的 谈话 . 观 察 市场 情况 等也 可以 获得 大量 的信 息 , 特 别 是 通过 人们 在日常生活 中 的 抱 怨 ...

  7. Linux编程中的坑——C++中exit和return的区别

    今天遇到一个坑,折腾了一天才把这个坑填上,情况是这样的: 写了段代码,在main()函数中创建一个分离线程,结果这个线程什么都没干就直接挂掉了,代码长这样: [cpp] view plaincopy ...

  8. 网络编程学习笔记(SIGPIPE信号触发)

    服务端代码: #include <sys/socket.h> #include <stdio.h> #include <netinet/in.h> #include ...

  9. 十三、linux编程中目录IO常用编程函数

    概念: 索引节点,Inode是Index Node的缩写,存储于文件系统上的任何文件都可以用索引节点来表示,所以也可以说索引节点是整个linux文件系统的基础.操作系统在读取硬盘的时候不是一个块一个块 ...

最新文章

  1. IIS配置跨服务器迁移
  2. 字符类型(Java)
  3. C#入门篇5-6:流程控制语句 foreach
  4. python函数小练习
  5. 程序员打造个人品牌 - Personal Brand的重要性
  6. 剑指Offer - 面试题53 - I. 在排序数组中查找数字 I(二分查找的变形版本)
  7. 事务演练 mysql
  8. wifi情况下使用fiddler_fiddler常见的应用场景
  9. 深度学习 | Why and How:神经网络中的权重初始化
  10. 联发科天玑800适配鸿蒙系统,联发科天玑800什么水平
  11. Ehcache详细解读
  12. swiper在微信端滑动效果不友好(滑动不了)的解决方案
  13. 物联网卡使用过程中的注意事项
  14. 最大值、数据排序、九九乘法表、杨辉三角
  15. 加一条平行于y轴的直线_Hepco海普克应用案例—直线V型滚轮导轨广泛应用于多轴机械手...
  16. 三十三.智能驾驶之多传感器融合技术: AVOD融合方法
  17. Excel 提取单元格中的数字、中/英文方法
  18. MSP430F5529-基于ATK-IMU901角度传感器在UART的串口通信于数据显示
  19. python自定义标识符的使用区分大小写吗_Python中的标识符是不区分大小写的
  20. 模板匹配、抓圆、抓边、二维码 零基础labview视觉培训教程《龙哥手把手教你学视觉》只有不会教的老师,没有学不会的学生

热门文章

  1. PotPlayer基本使用!
  2. uniapp报错{errMsg: ‘request:fail‘}
  3. “留得下”才能 “玩得好” 度假味儿渐浓的桃花潭
  4. Jo音乐——歌曲下载与播放器
  5. redis使用布隆过滤器
  6. MapBox在vue环境中添加图层样式错乱,修改样式无效的问题
  7. java mergecells_jxl操作excle表格中mergeCells中的参数
  8. Jetson TX2挂载SD卡--亲测有效!
  9. 怎么在Linux搭建一个可以装mod的Minecraft服务器(我的世界)
  10. 下一个蓝海:汽车垂直电商