Linux中如何屏蔽信号

2024-09-08 05:08
文章标签 linux 信号 屏蔽

本文主要是介绍Linux中如何屏蔽信号,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本篇文章主要学习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参数指向的信号集中的信号设置为信号掩码

三、屏蔽信号的处理

1)屏蔽信号的两种方式

因此,屏蔽某个信号有两种方式,,下面以SIGUSER1为例进行说明:
第一种方式为使用SIG_BLOCK操作方式,代码如下:

sigset_t sigset;
sigemptyset(&sigset);
sigaddset(&sigset,SIGUSER1);
sigprocmask(SIG_BLOCK,&sigset,NULL);

第二种方式为使用SIG_SETMASK操作方式,代码如下:

sigset_t set;
sigprocmask(SIG_SETMASK,NULL,&set); //先得到当前的信号掩码
sigaddset(&set,SIGUSER1);//将要屏蔽的信号加入
sigprocmask(SIG_SETMASK,&set,NULL);
2)解除屏蔽信号的两种方式

同样,要解除对信号的屏蔽,也有两种方式,仍以SIGUSER1为例进行说明。
第一种方式,使用使用SIG_UNBLOCK操作方式,代码如下:

sigset_t sigset;
sigemptyset(&sigset);
sigaddset(&sigset,SIGUSER1);
sigprocmask(SIG_UNBLOCK,&sigset,NULL);

第二种方式,使用SIG_SETMASK操作方式,代码如下:

sigset_t set;
sigprocmask(SIG_SETMASK,NULL,&set); //先得到当前的信号掩码
sigdelset(&set,SIGUSER1);//将要屏蔽的信号去除
sigprocmask(SIG_SETMASK,&set,NULL);

这篇关于Linux中如何屏蔽信号的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1147197

相关文章

Linux脚本(shell)的使用方式

《Linux脚本(shell)的使用方式》:本文主要介绍Linux脚本(shell)的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录概述语法详解数学运算表达式Shell变量变量分类环境变量Shell内部变量自定义变量:定义、赋值自定义变量:引用、修改、删

SpringBoot项目配置logback-spring.xml屏蔽特定路径的日志

《SpringBoot项目配置logback-spring.xml屏蔽特定路径的日志》在SpringBoot项目中,使用logback-spring.xml配置屏蔽特定路径的日志有两种常用方式,文中的... 目录方案一:基础配置(直接关闭目标路径日志)方案二:结合 Spring Profile 按环境屏蔽关

Linux链表操作方式

《Linux链表操作方式》:本文主要介绍Linux链表操作方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、链表基础概念与内核链表优势二、内核链表结构与宏解析三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势六、典型应用场景七、调试技巧与

全屋WiFi 7无死角! 华硕 RP-BE58无线信号放大器体验测评

《全屋WiFi7无死角!华硕RP-BE58无线信号放大器体验测评》家里网络总是有很多死角没有网,我决定入手一台支持Mesh组网的WiFi7路由系统以彻底解决网络覆盖问题,最终选择了一款功能非常... 自2023年WiFi 7技术标准(IEEE 802.11be)正式落地以来,这项第七代无线网络技术就以超高速

详解Linux中常见环境变量的特点与设置

《详解Linux中常见环境变量的特点与设置》环境变量是操作系统和用户设置的一些动态键值对,为运行的程序提供配置信息,理解环境变量对于系统管理、软件开发都很重要,下面小编就为大家详细介绍一下吧... 目录前言一、环境变量的概念二、常见的环境变量三、环境变量特点及其相关指令3.1 环境变量的全局性3.2、环境变

Linux系统中的firewall-offline-cmd详解(收藏版)

《Linux系统中的firewall-offline-cmd详解(收藏版)》firewall-offline-cmd是firewalld的一个命令行工具,专门设计用于在没有运行firewalld服务的... 目录主要用途基本语法选项1. 状态管理2. 区域管理3. 服务管理4. 端口管理5. ICMP 阻断

Linux实现线程同步的多种方式汇总

《Linux实现线程同步的多种方式汇总》本文详细介绍了Linux下线程同步的多种方法,包括互斥锁、自旋锁、信号量以及它们的使用示例,通过这些同步机制,可以解决线程安全问题,防止资源竞争导致的错误,示例... 目录什么是线程同步?一、互斥锁(单人洗手间规则)适用场景:特点:二、条件变量(咖啡厅取餐系统)工作流

Linux中修改Apache HTTP Server(httpd)默认端口的完整指南

《Linux中修改ApacheHTTPServer(httpd)默认端口的完整指南》ApacheHTTPServer(简称httpd)是Linux系统中最常用的Web服务器之一,本文将详细介绍如何... 目录一、修改 httpd 默认端口的步骤1. 查找 httpd 配置文件路径2. 编辑配置文件3. 保存

Linux使用scp进行远程目录文件复制的详细步骤和示例

《Linux使用scp进行远程目录文件复制的详细步骤和示例》在Linux系统中,scp(安全复制协议)是一个使用SSH(安全外壳协议)进行文件和目录安全传输的命令,它允许在远程主机之间复制文件和目录,... 目录1. 什么是scp?2. 语法3. 示例示例 1: 复制本地目录到远程主机示例 2: 复制远程主

Linux基础命令@grep、wc、管道符的使用详解

《Linux基础命令@grep、wc、管道符的使用详解》:本文主要介绍Linux基础命令@grep、wc、管道符的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录grep概念语法作用演示一演示二演示三,带选项 -nwc概念语法作用wc,不带选项-c,统计字节数-