Sigprocmask 函数|学习笔记

简介: 快速学习 Sigprocmask 函数

开发者学堂课程【物联网开发- Linux 高级程序设计全套视频:Sigprocmask 函数】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/660/detail/11024


Sigprocmask 函数

 

内容介绍

一、Sigprocmask 函数概述

二、讲解阻塞集合

三、举例演示

 

一、Sigprocmask 函数概述

创建一个阻塞集合

#include <signal.h>

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

How 对这个阻塞集合进行什么样的操作,set集合的地址,对阻塞集合操作的集合,oldset 是保存原来的阻塞集合。

保存的目的是为了保证阻塞集合变的时候,可以将原来的阻塞集合备份。

功能:

检查或修改信号阻塞集,根据 how 指定的方法对进程的阻塞集合进行修改,新的信号阻塞集由 set 指定,i而原先的信号阻塞集合由 oldset 保存。

参数:

how:信号阻塞集合的修改方法。

set:要操作的信号集地址。

oldset:保存原先信号集地址。

how:

SIG BLOCK:向信号阻塞集合中添加set信号集

SIG UNBLOCK:从信号阻塞集合中删除sct集合

SIG SETMASK:将信号阻寨集合设为set集合

 

二、讲解阻塞集合

假如说初始化一个空集合

sigset_ t set1;

sigemptset(&set1);

sigaddset(&set1,2);

sigaddset(&set1,3);

set1 这个集合当中有两个信号了

Sigset_t  oldset

定义一个集合是 oldset,将来保存以前的信号集合

1、定义一个 set1

sigprocmask(SIG BLOCK,&sell,&oldset);

这样调用的结果假如说默认有一个阻塞集合,这样的意思是将set1这个集合添加到集合里面去,集合中的2号信号和3号信号就到了阻塞集合里面去了,

如图

image.png

2号信号和3号信号在当前进程当中就被屏蔽了,屏蔽之后再次发送2号信号和三号信号是收不到的,还有一点需要注意,

如果说将set1添加到阻塞集合之前已经有2号信号了,将 set1 添加进来之后,这个集合仍然还有一个2号信号,集合当中的信号是不能重复的。

假如说添加之前阻塞集合里面的信号是2,6,8,然后我们调用代码,将 set1 集合的2,3调用到阻塞集合里面,那么阻塞集合里面就多了一个3,但是在多3之前,需要注意第三个参数是oldset集合,所以他会先将阻塞集合备份到oldset当中去。

image.gif2、定义一个set2

sigaddset(&set2,2);

sigaddset(&set2,6);

set2集合中含有信号2,6

sigprocmask(SIG UNBLOCK,&set2,&oldset);

SIG UNBLOCK将set2集合当中的2和6踢出去

image.gif3、定义一个set3

siqaddset(&set3,2);

sigaddset(&set3,5);

sigaddset(&set3,8);

set3中含有信号2,5,8

sigprocmask(SIG SETMASK&set3,&oldset);

调这句话的作用是将阻塞集设为set3的信号,其他的都不要了

image.gif

总体来说,这个函数有三种用法,第一种是将集合里面的信号放到阻塞集合里面去,第二种是将集合里面的信号从阻塞集合中踢出去,第三种是直接将阻塞集合里面的信号设置成set3集合里面的信号。

sigprocmask(SIG BLOCK,&sell,&oldset);

sigprocmask(SIG UNBLOCK,&set2,&oldset);

sigprocmask(SIG SETMASK&set3,&oldset);

注:

着set为NULL,则下改变信号阻塞集合,函数只把当前信号阻塞集合保存到 oldset 中。

返回值:

成功:返回 0失败:返回 -1

 

三、举例演示

这个举例说的是初始化一个集合,然后将集合添加到阻塞集里面去,所以集合当中的信号就被屏蔽了,那个时候发信号就是接收不到的,解除阻塞发信号就可以接收到

#include <stdio.h>

#include <stdlib.h>

#include <unistd.h>

#include <signal.h>

int main(int arge, char *argv[])

{

Sigset_t set ;

int i=0; 1

sigemptyset(&set);

sigaddsel(&sel,SIGINT);

while(1)

{

sigprocmask(SIG BLOCK,&set,NULL);

for(i=0;i<5;i++)

{

printf("STGTNT signal is blocked\n");

sleep(1);

}

for循环每五秒打印一条提示信息,在这循环五秒的时候按 Ctrl+C 是不好用的,他不接收二号信号,如果在这五秒内没有按过 Ctrl+C

sigprocmask(SIG UNBLOCK,&setNULL);

五秒钟是接触阻塞了,那么在这循环里面就是能接收到的

for(i=0; i<5; i++)

{

printf("SIGINT signal unblocked\n");

sleep(1);

}

}

return 0;

这个程序验证了,如果某一个信号在阻塞集合里面,给他发送信号是不好用的,一旦解除阻塞,马上就可以给他发送信号了,如果以前发过,那马上就能收到,如果没发过,就可以发送了。

相关文章
|
缓存 Linux API
文件IO和标准IO的区别
文件IO和标准IO的区别
532 2
|
JavaScript 前端开发 数据建模
探索未来编程新范式:响应式编程的崛起与实践
本文将深入探讨响应式编程的核心概念、技术优势及其在现代软件开发中的应用。通过实例解析,揭示这一新兴编程范式如何简化异步数据处理,提高代码的可维护性和效率,为读者提供从传统命令式编程向声明式编程转型的新视角。 ####
|
Ubuntu 搜索推荐 Linux
指导如何在Ubuntu系统中卸载QT Creator。
综上所述,通过终端,我们可以灵活地卸载QT Creator,这种方法既高效又有效。根据QT Creator安装时的具体方式与版本,相应的卸载步骤可能会有所不同。在执行上述任何命令时,务必确保替换成适用于您系统的具体命令与文件路径。
984 0
|
Linux
【Linux】System V信号量详解以及semget()、semctl()和semop()函数讲解
System V信号量的概念及其在Linux中的使用,包括 `semget()`、`semctl()`和 `semop()`函数的具体使用方法。通过实际代码示例,演示了如何创建、初始化和使用信号量进行进程间同步。掌握这些知识,可以有效解决多进程编程中的同步问题,提高程序的可靠性和稳定性。
1338 19
|
存储 Linux
linux waitpid函数详解
linux waitpid函数详解
1299 0
|
Linux Shell
Linux系统编程:掌握popen函数的使用
记得在使用完 `popen`打开的流后,总是使用 `pclose`来正确关闭它,并回收资源。这种做法符合良好的编程习惯,有助于保持程序的健壮性和稳定性。
1209 6
|
算法 程序员 开发工具
C语言编程规范
C 语言编程规范有助于提升代码的可读性、可维护性和可移植性。主要包括:命名规范(如 `my_variable`、`MAX_SIZE`)、代码缩进与空格、注释(解释逻辑但不过度)、函数设计(短小精悍、参数不超过三个)、错误处理、避免魔法数字、选择合适数据结构、使用标准库、保持代码格式一致及版本控制。遵循这些规范能显著提高团队开发效率和代码质量。
2291 2
为什么阿里百炼不能用
该代码段尝试使用DashScope调用`baichuan2-turbo`模型,并打印请求结果。然而,请求被拒绝,返回的请求ID为`01a480ae-57b1-9876-b496-ea5529730d15`,状态码为`403`,错误代码为`AccessDenied`,提示访问被拒绝。建议检查API密钥和权限设置。
|
消息中间件 Unix Linux
C语言 多进程编程(五)消息队列
本文介绍了Linux系统中多进程通信之消息队列的使用方法。首先通过`ftok()`函数生成消息队列的唯一ID,然后使用`msgget()`创建消息队列,并通过`msgctl()`进行操作,如删除队列。接着,通过`msgsnd()`函数发送消息到消息队列,使用`msgrcv()`函数从队列中接收消息。文章提供了详细的函数原型、参数说明及示例代码,帮助读者理解和应用消息队列进行进程间通信。
|
存储 安全 Linux
Linux命令mkfifo深度解析
`mkfifo`在Linux中创建命名管道,用于进程间通信(IPC)。管道是临时的,非持久存储,作为数据传输的通道。特点是无缓冲、支持阻塞/非阻塞模式和权限控制。命令语法:`mkfifo -m &lt;权限&gt; 文件名`。示例:创建`mypipe`,一个进程写入,另一进程读取。注意选择阻塞模式、管理权限、删除不再使用的管道,并处理可能的错误。用于数据交换和高效能应用。

热门文章

最新文章