linux任务处理函数,Linux信号掩码和信号处理函数

1、信号掩码——被阻塞的信号集

每个进程都有一个用来描述哪些信号传送来将被阻塞的信号集,如果某种信号在某个进程的阻塞信号集中,则传送到该进程的此种信号将会被阻塞。当前被进程阻塞的信号集也叫信号掩码,类型为sigset_t。每个进程都有自己的信号掩码,且创建子进程时,子进程会继承父进程的信号掩码。

2、信号阻塞和忽略的区别

阻塞的概念与忽略信号是不同的:操作系统在信号被进程解除阻塞之前不会将信号传递出去,被阻塞的信号也不会影响进程的行为,信号只是暂时被阻止传递;当进程忽略一个信号时,信号会被传递出去,但进程将信号丢弃。

每个进程都有一个信号掩码,信号掩码是一个“位图”,如果位图中某位标识1,表示该位对应的信号被暂时屏蔽。如果标识为0,表示进程可以接收这个信号。

System V signal API信号处理函数除了sigset外,还有以下几个。

sighold()函数

把指定的信号增加到信号掩码中去(将位图中对应的位标识为1),这样就暂时屏蔽了该信号。

返回值:成功返回0,失败返回-1。

sigrelse()函数

从信号掩码中移除指定的信号,这样进程就可以接收该信号了。

返回值:成功返回0,失败返回-1。

sigignore()函数

将信号配置为SIG_IGN,即忽略该信号。

返回值:成功返回0,失败返回-1。

sigignore(SIGALRM)相当于sigset(SIGALRM, SIG_IGN)

使用方法:

当程序里有一部分代码执行时不想被某个信号中断,可以使用sighold函数和sigrelse函数,临时屏蔽和恢复某个信号。

例子程序:test9.c

#include

#include

void AlarmHandle()

{

printf("AlarmHandle\n");

}

int main(void)

{

int i;

sigset(SIGALRM, AlarmHandle);//注册信号处理函数

alarm(5);//设置闹钟函数5秒发送SIGALRM信号

sighold(SIGALRM);//暂时屏蔽信号

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

{

printf("i=%d\n", i);

sleep(1);

}

sigrelse(SIGALRM);//从信号掩码中移除信号

printf("3333\n");

return 0;

}

执行结果:

[root@server ~]# ./test9

i=0

i=1

i=2

i=3

i=4

i=5

i=6

i=7

i=8

i=9

AlarmHandle

3333

程序先设置闹钟函数,时间是5秒,在执行for循环前暂时屏蔽了SIGALRM信号,使for循环不会被中断。因为在for执行过程中,alarm时间已到,系统发送的信号SIGALRM被阻塞。for循环结束后恢复响应信号,系统发送信号,就先执行了信号处理函数,打印AlarmHandle,然后打印3333,程序结束。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值