当前位置: 首页 > Linux

Linux系统编程-信号集操作函数

时间:2023-04-07 00:50:47 Linux

先来回顾一下什么是pending信号集。信号从生成到目的地的传递称为信号传递。信号从生成到传递的中间状态称为信号的挂起状态。pending状态的原因可能是信号被阻塞,即信号屏蔽字(或blockedsignalset,掩码)对应的位被置1。阻塞信号集和pending信号集都保持由内核。整个过程如下图所示:有时候我们需要屏蔽某个信号,所以需要修改屏蔽信号集。那么,我们如何修改阻塞信号集呢?系统提供的一种方法是我们先创建一个与阻塞信号集相同的集合,然后用它来修改阻塞信号集。系统提供了一系列的信号组设置功能。这些函数如下:sigset_tset;信号集数据类型,本质是typedefunsignedlongsigset_t;intsigemptyset(sigset_t*set);清除某个信号设置为0intsigfillset(sigset_t*set);将某个信号集设置为1intsigaddset(sigset_t*set,intsignum);向信号集添加一个信号intsigdelset(sigset_t*set,intsignum);从信号集中清除一个信号以上函数的返回值为:success:0;失败:-1intsigismember(constsigset_t*set,intsignum);判断信号是否在信号集中返回值:在信号集中:1;不在:0;Error:-1使用以上函数创建信号集后,怎么办?改变阻塞信号集怎么样?系统提供了另外一个函数:sigprocmask函数。sigprocmask函数可用于屏蔽信号或取消屏蔽信号。其实质就是利用我们创建的信号集来改变被阻塞的信号集。函数原型:intsigprocmask(inthow,constsigset_tset,sigset_toldset);返回值:成功:0;failure:-1,seterrno参数说明:set:传入的参数是位图,在set中哪个位置为1,表示当前进程阻塞了哪个信号。oldset:传出参数,保存旧的信号掩码集。这个有点类似于setitimer。how参数值:假设当前信号屏蔽字为mask1。SIG_BLOCK:当how设置为该值时,set表示需要屏蔽的信号。相当于mask=mask|set2.SIG_UNBLOCK:当how设置为这个时,set表示需要unmask的信号。等价于mask=mask&~set3.SIG_SETMASK:当how设置为这个时,set代表新的mask集合,用来替换原来的mask。相当于mask=set。如果调用sigprocmask解除阻塞多个当前信号,则至少有一个信号将在sigprocmask返回之前传递。我们如何读取挂起的信号集?系统提供挂起功能。函数原型:intsigpending(sigset_t*set);参数说明:设置出局参数。返回值:返回值:成功:0;失败:-1,设置errno示例:将所有常规信号的挂起状态打印到屏幕。1#include2#include3#include45voidprintPending(sigset_t*set)6{7inti=0;89for(i=0;i<32;i++){10if(sigismember(set,i)==1)11printf("1");12else13printf("0");14}15printf("\n");16}1718intmain()19{20sigset_tset,oldset,pendset;21sigemptyset(&set);22sigaddset(&set,SIGQUIT);//ctrl+\将生成SIGQUIT信号23sigprocmask(SIG_BLOCK,&set,&oldset);24while(1){25sigpending(&pendset);26printPending(&pendset);//编写一个函数来打印挂起信号set27sleep(1);28}29}最后,最近有很多朋友找我要一份Linux学习路线图,所以我根据自己的经验,利用业余时间熬了一个月,整理了一本电子书。无论你是面试还是自我提升,相信都会对你有所帮助!免费送给大家,只求大家给我点个赞!电子书|LinuxDevelopmentLearningRoadmap也希望有小伙伴可以和我一起把这本电子书做得更完美!获得?希望老铁们来个三连击,让更多人看到这篇文章。推荐阅读:干货|程序员和高级架构师免费发送工件的必备资源|支持搜索的资源网站