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

相关文章
|
16天前
|
Linux
在 Linux 系统中,“cd”命令用于切换当前工作目录
在 Linux 系统中,“cd”命令用于切换当前工作目录。本文详细介绍了“cd”命令的基本用法和常见技巧,包括使用“.”、“..”、“~”、绝对路径和相对路径,以及快速切换到上一次工作目录等。此外,还探讨了高级技巧,如使用通配符、结合其他命令、在脚本中使用,以及实际应用案例,帮助读者提高工作效率。
57 3
|
16天前
|
监控 安全 Linux
在 Linux 系统中,网络管理是重要任务。本文介绍了常用的网络命令及其适用场景
在 Linux 系统中,网络管理是重要任务。本文介绍了常用的网络命令及其适用场景,包括 ping(测试连通性)、traceroute(跟踪路由路径)、netstat(显示网络连接信息)、nmap(网络扫描)、ifconfig 和 ip(网络接口配置)。掌握这些命令有助于高效诊断和解决网络问题,保障网络稳定运行。
48 2
|
10天前
|
Ubuntu Linux 网络安全
linux系统ubuntu中在命令行中打开图形界面的文件夹
在Ubuntu系统中,通过命令行打开图形界面的文件夹是一个高效且实用的操作。无论是使用Nautilus、Dolphin还是Thunar,都可以根据具体桌面环境选择合适的文件管理器。通过上述命令和方法,可以简化日常工作,提高效率。同时,解决权限问题和图形界面问题也能确保操作的顺利进行。掌握这些技巧,可以使Linux操作更加便捷和灵活。
15 3
|
18天前
|
缓存 Linux 开发者
Linux内核中的并发控制机制:深入理解与应用####
【10月更文挑战第21天】 本文旨在为读者提供一个全面的指南,探讨Linux操作系统中用于实现多线程和进程间同步的关键技术——并发控制机制。通过剖析互斥锁、自旋锁、读写锁等核心概念及其在实际场景中的应用,本文将帮助开发者更好地理解和运用这些工具来构建高效且稳定的应用程序。 ####
35 5
|
16天前
|
安全 网络协议 Linux
本文详细介绍了 Linux 系统中 ping 命令的使用方法和技巧,涵盖基本用法、高级用法、实际应用案例及注意事项。
本文详细介绍了 Linux 系统中 ping 命令的使用方法和技巧,涵盖基本用法、高级用法、实际应用案例及注意事项。通过掌握 ping 命令,读者可以轻松测试网络连通性、诊断网络问题并提升网络管理能力。
53 3
|
19天前
|
安全 Linux 数据安全/隐私保护
在 Linux 系统中,查找文件所有者是系统管理和安全审计的重要技能。
在 Linux 系统中,查找文件所有者是系统管理和安全审计的重要技能。本文介绍了使用 `ls -l` 和 `stat` 命令查找文件所有者的基本方法,以及通过文件路径、通配符和结合其他命令的高级技巧。还提供了实际案例分析和注意事项,帮助读者更好地掌握这一操作。
37 6
|
6月前
|
消息中间件 存储 缓存
【嵌入式软件工程师面经】Linux系统编程(线程进程)
【嵌入式软件工程师面经】Linux系统编程(线程进程)
127 1
|
7月前
|
Linux 调度 数据库
Linux下的系统编程——线程同步(十三)
Linux下的系统编程——线程同步(十三)
114 0
Linux下的系统编程——线程同步(十三)
|
存储 Linux 调度
Linux系统编程 多线程基础
Linux系统编程 多线程基础
63 1
|
7月前
|
存储 安全 数据管理
Linux系统编程教程之Linux线程函数的使用:讲解Linux线程函数
Linux系统编程教程之Linux线程函数的使用:讲解Linux线程函数
68 1