最全Linux中如何屏蔽信号_屏蔽信号后是什么样的,看完这篇彻底明白了

img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

本篇文章主要学习Linux的信号处理机制,着重学习屏蔽信号部分。屏蔽信号处理的两种方式类似于信号的捕获,一种方式是直接对其设置,另一种方式是先获得描述符的掩码,然后对其设置操作。
本文主要参考自《嵌入式linux系统使用开发》,作者何永琪,Thanks.

在linux系统中,如何处理某个进程发送的一个特定信号呢?一般来说有三种方式:

  1. 忽略信号
  2. 屏蔽信号
  3. 为该信号添加用户自定义的信号处理函数,从而优先调用,而不使用默认的操作。
一、信号集基本操作函数

本篇文章着重解决第二种方案,如何屏蔽该信号。
在Linux上有一组函数专门用于对信号集进行操作,它们的接口头文件及原型如下:

#include <signal.h>
int sigemptyset(sigset_t *set);
int sigfillset(sigset_t *set);
int sigaddset(sigset_t *set,int signum);
int sigdelset(sigset_t *set,int signum);
int sigismember(const sigset_t *set,int signum);

其中set参数指向要操作的信号集,而signum参数则代表一个指定的信号,各个函数的作用如下:

函数作用
sigemptyset清空信号集,返回0表示成功,-1表示失败
sigfillset将所有信号加入信号集,返回0表示成功,-1表示失败
sigaddset将指定信号加入信号集,返回0表示成功,-1表示失败
sigdelset将指定信号从信号集中去除,返回0表示成功,-1表示失败
sigismember判断一个指定的信号是否在信号集中,返回1表示在信号集中,0表示不在信号集中,-1表示有错误发生。

有了这些函数,编程时就没必要直接对sigset_t型数据进行操作了,从而也不必知道它的具体含义。一般来说,信号集在使用前需要先用sigemptyset或者sigfillset函数进行初始化,然后调用sigaddset或sigdelset函数增加或去除需要的信号。

二、sigprocmask函数定义

在调用sigaction函数时,可以设置信号处理时需要屏蔽的信号。实际上在代码中也可以直接设置或获取进程的信号掩码。所使用的接口函数如下:

int sigprocmask(int how,const sigset_t *set, sigset_t *oldset);

其各个参数及返回值含义解释如下:

参数作用
how指定操作信号掩码的方式
set指向用于设置信号掩码的信号集
oldset用于返回原来的信号掩码
返回值0表示成功,-1表示失败

sigprocmask函数根据参数how指定的方式,设置当前进程的信号掩码,并把原来的信号掩码保存在参数oldset指向的信号集中返回。
如果set参数为NULL,则不修改信号掩码;如果oldset参数为NULL,则不返回原来的信号掩码。
这里关键要理解参数how的使用。它由如下三个取值:

参数how作用
SIG_BLOCK将set参数指向的信号集中的信号加入到信号掩码中
SIG_UNBLOCK将set参数指向的信号集中的信号从信号掩码中删除
SIG_SETMASK将set参数指向的信号集中的信号设置为信号掩码
三、屏蔽信号的处理

img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**

如果你需要这些资料,可以戳这里获取

  • 19
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值