linux 信号集使用注意事项,Linux 信号集 浅析

Linux信号有多种说法。一个进程创建一个信号用于发送给另外一个进程叫做发送一个信号,内核创建一个信号叫做生成一个信号,进程自己向自己发送信号叫做唤起一个信号。不过我看也没必要这么学究气。

信号集--signel set,其实就是将多个信号放在集合中进行集中的处理。POSIX.1定义了sigset_t以包涵一个信号集,并且定义了五个处理信号的函数:

int sigemptyset(sigset_t *set);

int sigfillset(sigset_t *set);

int sigaddset(sigset_t *set,int signo);

int sigdelset(sigset_t *set,int signo)

int sigismember(const sigset_t *set,int signo);

还有一个重要的函数:int sigprocmask(int how,const sigset_t *restrict set,sigset_t *restrict oset);

单纯讲这些函数很难讲明白,下面结合程序来讲,程序来自UNIX环境高级编程:

static void sig_quit(int);   //信号处理函数

int main( )

{

sigset_t newmask,oldmask,pendmask;

if(signal(SIGQUIT,sig_quit)==SIG_ERR)

err_sys("can not catch SIGQUIT");

-----------------------------------------------------------------------------------------------------------

sigemptyset(&newmask);    //清空信号掩码集newmask,不阻塞任何信号

sigaddset(&newmask,SIGQUIT);  //将SIGQUIT信号放入信号集newmask中去

if(sigprocmask(SIG_BLOCK,&newmask,&oldmask)<0) //将oldmask 和newmask合并

err_sys("SIG_BLOCK error");  //当前信号屏蔽字放在newmask里,以前的放在oldmask里

sleep(5);

if(sigpending(&pendmask)<0)   //保存所有被阻塞的信号,本例即保存SIGQUIT到pendmask中去

err_sys("sigpending error");

if(sigismember(&pendmask,SIGQUIT)) //测试SIGQUIT是否在信号掩码集pendmask中

err_sys("SIGQUIT pending");

if(sigprocmask(SIG_SETMASK,&oldmask,NULL)<0)  //将信号屏蔽字恢复为原来的信号集

err_sys("SIG_SETMASK error");

printf("SIGQUIT unblocked");

sleep(5);

exit(0);

}

static  void sig_quit(int signo)

{

if(signal(SIGQUIT,SIG_DFL)==SIG_ERR)

err_sys("can not reset SIGQUIT");

}

这个就是这几个函数的作用。通过实例来讲解,理解会更加明白一些

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值