linux c signal 函数,Linux c之信号集使用

Linux信号集

1. 信号集概念

信号集是一个能表示多个信号的数据类型,sigset_t set ;set即一个信号集。

既然是一个集合,就需要对集合进行添加/删除等操作。

int sigemptyset(sigset_t *set); 将set集合置空

int sigfillset(sigset_t *set); 将所有信号加入set集合

int sigaddset(sigset_t *set,int signo); 将signo信号加入到set集合

int sigdelset(sigset_t *set,int signo); 从set集合中移除signo信号

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

signo判断信号是否存在于set集合中

代码举例:

include

#include

#include

#include

#include

int main()

{

sigset_t sigset;

sigfillset(&sigset);

if(sigismember(&sigset,SIGINT))

printf("SIGINT exist in signal_set!\n");

if(sigismember(&sigset,SIGTERM))

printf("SIGTERM exist in signal_set!\n");

if(sigismember(&sigset,SIGABRT))

printf("SIGABRT exist in signal_set!\n");

if(sigdelset(&sigset,SIGINT)<0)

perror("del error\n");

else

printf("SIGINT have been removed!\n");

if(sigismember(&sigset,SIGINT))

printf("SIGINT exist in signal_set!\n");

else

printf("SIGINT not exist in signal_set!\n");

}

输出:

$ ./sigset

SIGINT exist in signal_set!

SIGTERM exist in signal_set!

SIGABRT exist in signal_set!

SIGINT have been removed!

SIGINT not exist in signal_set!

2. 信号集的使用

定义信号集->设置信号屏蔽位->定义信号处理函数->检测信号

<1>使用1中的函数即可完成信号集的定义,之后是

<2>设置信号屏蔽位

其作用为设置某个进程需要屏蔽的信号

Int sigprocmask(int how,const sigset_t *set,sigset_t *oset);

参数

How 指示如何修改屏蔽信号

Set是一个非空指针时,根据how修改屏蔽信号

Oset是一个非空指针时,存放当前屏蔽信号集

若set为NULL,不改变该进程的信号屏蔽字,how也无意义

How的取值:

S I G B L O C K

该进程新的信号屏蔽字是其当前信号屏蔽字和s e t指向信号集的并集。s e t包含了我们希望阻塞的附加信号

S I G U N B L O C K

该进程新的信号屏蔽字是其当前信号屏蔽字和s e t所指向信号集的交集。s e t包含了我们希望解除阻塞的信号

S I G S E T M A S K

该进程新的信号屏蔽是s e t指向的值

[NextPage]

举例

#include

#include

#include

#include

#include

void msg(int signo)

{

if(signo==SIGINT)

printf("Get SIGINT!\n");

else

printf("Get SIGQUIT!\n");

}

int main()

{

sigset_t sigset,oset;

sigemptyset(&sigset);

sigaddset(&sigset,SIGINT);

sigprocmask(SIG_BLOCK,&sigset,&oset);

signal(SIGINT,msg);

signal(SIGQUIT,msg);

sleep(2);

raise(SIGINT);

raise(SIGQUIT); 30.}

输出

Get SIGQUIT!

<3>定义信号处理函数

s i g a c t i o n函数的功能是检查或修改(或两者)与指定信号相关联的处理动作。此函数取代了U N I

X早期版本使用的s i g n a l函数

Int sigaction(int signo,const struct sigaction *act,struct

sigaction *oact);

参数:signo 要检测或修改动作的信号量

Act 非空时,表示要修改的动作

Oact非空时,返回处理该信号的原先动作

结构体sigaction如下:

struct sigaction {

void (*sa_handler)();

sigset_t sa_mask;

int sa_flags;

} ;

举例

#include

#include

#include

#include

#include

void msg(int signo)

{

if(signo==SIGINT)

printf("Get SIGINT!\n");

}

int main()

{

sigset_t sigset,oset;

struct sigaction action1,action2;

action1.sa_handler=msg;

sigaction(SIGINT,&action1,&action2);

sleep(2);

raise(SIGINT);

}

输出:

Get SIGINT

<4>检测被搁置信号

Int sigpending(sigset_t *set);

返回对于调用进程被阻塞不能递送和当前未决的信号集。该信号集通过s e t参数返回

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值