Linux信号掩码和信号处理函数
2015-10-12 14:05
316 查看
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
执行结果:
程序先设置闹钟函数,时间是5秒,在执行for循环前暂时屏蔽了SIGALRM信号,使for循环不会被中断。因为在for执行过程中,alarm时间已到,系统发送的信号SIGALRM被阻塞。for循环结束后恢复响应信号,系统发送信号,就先执行了信号处理函数,打印AlarmHandle,然后打印3333,程序结束。
原文地址:www。live-in。org/archives/2237。html
每个进程都有一个用来描述哪些信号传送来将被阻塞的信号集,如果某种信号在某个进程的阻塞信号集中,则传送到该进程的此种信号将会被阻塞。当前被进程阻塞的信号集也叫信号掩码,类型为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 <stdio.h> #include <signal.h> 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,程序结束。
原文地址:www。live-in。org/archives/2237。html
相关文章推荐
- Linux内核源码(asm/atomic.h)学习
- CentOS 6 安装Maven
- Linux下log4cxx的安装使用
- Linux 命令 - fg & bg: 将进程切换到前台(后台)运行
- Linux常用命令
- arch linux设备(请参考官方文档,桌面安装没有找到一个好工作后)
- CentOS7下安装chrome浏览器
- github linux 用法
- Linux 2.6.34下 USB驱动(U盘\USB鼠标、键盘)
- linux下查看用户及用户组的方法
- linux系统的任务计划crontab使用详解
- linux系统的任务计划crontab使用详解
- 安装网页图形界面管理Linux
- Linux 常用命令(转)
- inittab文件内容解析
- CentOS下MySQL数据库调优
- Linux改变进程优先级的nice及renice命令
- CentOS下MySQL安装后配置和设置
- Linux-CentOS 用户名 不在 sudoers文件中,此事将被报告
- 正则表达式技术实例