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信号

目录
相关文章
|
2天前
|
IDE Linux 开发工具
Linux 系统上安装
在Linux和Mac上安装Lua 5.3.0只需下载源码,解压,编译和安装。Windows用户可选择SciTE IDE或通过LuaForWindows在Github或Google Code下载安装。创建 HelloWorld.lua,使用`lua HelloWorld.lua`运行显示&quot;Hello World!&quot;。另可参考LuaDist官方推荐方式安装。
|
1天前
|
监控 JavaScript Linux
Linux系统之部署Homepage个人导航页
【5月更文挑战第13天】Linux系统之部署Homepage个人导航页
17 1
|
2天前
|
监控 JavaScript 网络协议
Linux系统之安装uptime-kuma服务器监控面板
【5月更文挑战第12天】Linux系统之安装uptime-kuma服务器监控面板
13 0
|
2天前
|
Linux Perl
Linux系统的文本处理
Linux系统的文本处理
|
2天前
|
安全 网络协议 Linux
linux必学的60个命令
Linux是一个功能强大的操作系统,提供了许多常用的命令行工具,用于管理文件、目录、进程、网络和系统配置等。以下是Linux必学的60个命令的概览,但请注意,这里可能无法列出所有命令的完整语法和选项,仅作为参考
196 2
|
1天前
|
存储 Linux Shell
YUM管理器的命令列表-Linux
YUM管理器的命令列表-Linux
7 0
|
2天前
|
Linux 程序员 计算机视觉
【linux 学习】在Linux中经常用到的cmake、make、make install等命令解析
【linux 学习】在Linux中经常用到的cmake、make、make install等命令解析
16 0
|
2天前
|
Linux
Linux的find命令使用
【5月更文挑战第11天】Linux的find命令使用
15 3
|
2天前
|
监控 Linux 数据处理
|
2天前
|
编解码 Ubuntu Linux