当前位置: 首页 > 科技观察

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

时间:2023-03-21 22:21:03 科技观察

先来回顾一下什么是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;failure:-1intsigismember(constsigset_t*set,intsignum);判断信号是否在信号集中返回值:在信号集中:1;不在:0;错误:-1使用以上函数创建信号集后,如何更改阻塞信号集?系统提供了另外一个函数:sigprocmask函数。sigprocmask函数可用于屏蔽信号或取消屏蔽信号。其实质就是利用我们创建的信号集来改变被阻塞的信号集。函数原型:intsigprocmask(inthow,constsigset_tset,sigset_toldset);返回值:成功:0;failure:-1,seterrno参数说明:set:传入的参数是位图,在set中哪个位置为1,表示当前进程阻塞哪个信号。oldset:传出参数,保存旧的信号掩码集。这个有点类似于setitimer。how参数值:假设当前信号屏蔽字为maskSIG_BLOCK:当how设置为该值时,set表示需要屏蔽的信号。相当于mask=mask|setSIG_UNBLOCK:当how设置为这个时,set表示需要unmask的信号。相当于mask=mask&~setSIG_SETMASK:当how设置为这个时,set代表新的mask集合,用来替换原来的mask。相当于mask=set。如果调用sigprocmask解除阻塞多个当前信号,则至少有一个信号将在sigprocmask返回之前传递。我们如何读取挂起的信号集?系统提供挂起功能。函数原型:intsigpending(sigset_t*set);参数说明:设置出局参数。返回值:返回值:成功:0;失败:-1,设置errno示例:将所有通用信号的挂起状态打印到屏幕。#include#include#includevoidprintPending(sigset_t*set){inti=0;for(i=0;i<32;i++){if(sigismember(set,i)==1)printf("1");elseprintf("0");}printf("\n");}intmain(){sigset_tset,oldset,pendset;sigemptyset(&set);sigaddset(&set,SIGQUIT);//ctrl+\会产生SIGQUIT信号sigprocmask(SIG_BLOCK,&set,&oldset);while(1){sigpending(&pendset);printPending(&pendset);//写一个函数打印挂起的信号集sleep(1);世界500强外企Linux开发工程师梁旭,在公众号分享大量Linux干货,欢迎关注!