Linux系统应用编程 --- 信号处理函数(sigprocmask、sigpending函数)

简介: Linux系统应用编程 --- 信号处理函数(sigprocmask、sigpending函数)

信号集处理函数

1. int sigemptyset(sigset_t *set);                         清空信号集,将信号集全部置0
2. 
3. int sigfillset(sigset_t *set);                                 将信号集全部置1
4. 
5. int sigaddset(sigset_t *set, int signo)                把信号集的某一个信号位置1
6. 
7. int sigdelset(sigset_t *set, int signo);                 把信号集的某一个信号位置0;
8. 
9. int sigismember(const sigset_t *set, int signo);  判断这个信号集的某个信号位是否置位

sigprocmask函数

一个进程的信号屏蔽字规定了当前阻塞而不能递送给该进程的信号集。调用函数sigprocmask可以检测或更改其信号屏蔽字,或者在一个步骤中同时执行这两个操作。

1. #include <signal.h>
2. 
3. int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);

首先,若oldset是非空指针,那么进程的当前信号屏蔽字通过oldset返回。

其次,若set是一个非空指针,则参数how指示如何修改当前信号屏蔽字。

若set是空指针,则不改变该进程的信号屏蔽字,how的值也无意义了。

下面表格说明了how可选用的值。注意,不能阻塞SIGKILL和SIGSTOP信号。

How参数

说明

SIG_BLOCK

该进程新的信号屏蔽字是其当前信号屏蔽字和set指向信号集的的并集,set包含了我们希望阻塞的附加信号

SIG_UNBLOCK

该进程新的信号屏蔽字是其当前信号屏蔽字和set指向信号补集的交集,set包含了我们希望解除阻塞的信号

SIG_SETMASK

该进程新的信号屏蔽字将被set指向的信号集的值代替

返回值:成功返回0,出错返回-1

 

sigpending函数

1. #include <signal.h>
2. 
3. int sigpending(sigset_t *set);

sigpending读取当前进程的未决信号集,通过set参数传出。调用成功则返回0,出错则返回-1。

 

程序:通过sigprocmask设置要阻塞的信号,通过sigpending打印已经阻塞的信号,并在终端输出

1. #include <stdio.h>
2. #include <signal.h>
3. #include <unistd.h>
4. 
5. void printsigset(const sigset_t *set)
6. {
7.  int i ;
8.  for(i=1; i<32; i++)
9.    if(sigismember(set, i) == 1)  //判断信号集是否置位
10.       putchar('1');
11.     else
12.       putchar('0');
13.   puts("");
14. }
15. 
16. int main(void)
17. {
18.   sigset_t s, p;
19.   sigemptyset(&s);          //清空信号集
20.   sigaddset(&s, SIGINT);        //将信号位2:SIGINT置1
21.   sigprocmask(SIG_BLOCK, &s, NULL); //在信号集中添加刚才sigaddset的SIGINT信号阻塞
22.   while(1){
23.     sigpending(&p);         //调用sigpending读取当前进程未决信号集
24.     printsigset(&p);
25.     sleep(1);
26.   }
27.   return 0;
28. }

执行结果如下:在键盘上按Ctrl+C可以产生SIGINT信号

目录
打赏
0
0
0
0
20
分享
相关文章
Linux系统资源管理:多角度查看内存使用情况。
要知道,透过内存管理的窗口,我们可以洞察到Linux系统运行的真实身姿,如同解剖学家透过微观镜,洞察生命的奥秘。记住,不要惧怕那些高深的命令和参数,他们只是你掌握系统"魔法棒"的钥匙,熟练掌握后,你就可以骄傲地说:Linux,我来了!
70 27
|
11天前
|
Linux系统ext4磁盘扩容实践指南
这个过程就像是给你的房子建一个新的储物间。你需要先找到空地(创建新的分区),然后建造储物间(格式化为ext4文件系统),最后将储物间添加到你的房子中(将新的分区添加到文件系统中)。完成这些步骤后,你就有了一个更大的储物空间。
65 10
|
2月前
|
Linux系统之whereis命令的基本使用
Linux系统之whereis命令的基本使用
108 24
Linux系统之whereis命令的基本使用
|
23天前
|
Linux系统中如何查看CPU信息
本文介绍了查看CPU核心信息的方法,包括使用`lscpu`命令和读取`/proc/cpuinfo`文件。`lscpu`能快速提供逻辑CPU数量、物理核心数、插槽数等基本信息;而`/proc/cpuinfo`则包含更详细的配置数据,如核心ID和处理器编号。此外,还介绍了如何通过`lscpu`和`dmidecode`命令获取CPU型号、制造商及序列号,并解释了CPU频率与缓存大小的相关信息。最后,详细解析了`lscpu`命令输出的各项参数含义,帮助用户更好地理解CPU的具体配置。
74 8
深度体验阿里云系统控制台:SysOM 让 Linux 服务器监控变得如此简单
作为一名经历过无数个凌晨三点被服务器报警电话惊醒的运维工程师,我对监控工具有着近乎苛刻的要求。记得去年那次大型活动,我们的主站流量暴增,服务器内存莫名其妙地飙升到90%以上,却找不到原因。如果当时有一款像阿里云 SysOM 这样直观的监控工具,也许我就不用熬通宵排查问题了。今天,我想分享一下我使用 SysOM 的亲身体验,特别是它那令人印象深刻的内存诊断功能。
|
2月前
|
linux中的目录操作函数
本文详细介绍了Linux系统编程中常用的目录操作函数,包括创建目录、删除目录、读取目录内容、遍历目录树以及获取和修改目录属性。这些函数是进行文件系统操作的基础,通过示例代码展示了其具体用法。希望本文能帮助您更好地理解和应用这些目录操作函数,提高系统编程的效率和能力。
193 26
|
13天前
|
微服务2——MongoDB单机部署4——Linux系统中的安装启动和连接
本节主要介绍了在Linux系统中安装、启动和连接MongoDB的详细步骤。首先从官网下载MongoDB压缩包并解压至指定目录,接着创建数据和日志存储目录,并配置`mongod.conf`文件以设定日志路径、数据存储路径及绑定IP等参数。之后通过配置文件启动MongoDB服务,并使用`mongo`命令或Compass工具进行连接测试。此外,还提供了防火墙配置建议以及服务停止的两种方法:快速关闭(直接杀死进程)和标准关闭(通过客户端命令安全关闭)。最后补充了数据损坏时的修复操作,确保数据库的稳定运行。
46 0
Linux 主要应用领域的归纳
服务器领域 Linux在服务器领域的应用是其最为广泛和成熟的领域之一。由于其开源、稳定、高效和安全的特性,Linux成为许多企业服务器的首选操作系统。 Web服务器:Linux是Web服务器的理想选择,因为它支持Apache、Nginx等流行的Web服务器软件,这些软件在Linux上运行稳定且性能卓越。Linux服务器可以高效地处理大量并发请求,提供快速、可靠的Web服务。 数据库服务器:Linux也广泛用于数据库服务器,如MySQL、PostgreSQL和Oracle等数据库管理系统在Linux上运行良好。Linux的稳定性和安全性使得它成为存储和管理敏感数据的理想平台。 邮件服务器:Lin
89 5
安装【银河麒麟V10】linux系统--并挂载镜像
安装【银河麒麟V10】linux系统--并挂载镜像
3226 0
卸载、下载、安装mysql(Linux系统centos7)
卸载、下载、安装mysql(Linux系统centos7)
297 0