Linux学习笔记19——信号2
2013-12-31 15:40
435 查看
上一节中讲到了sigprocmask函数,它的作用是检查或修改它的进程信号掩码,这一节我们主要学习捕捉与忽略信号的函数sigaction和等待信号函数。
一 sigaction函数的作用
定义在接收到参数sig指定的信号后应该采取的行动,声明如下:
我们注意到,上面的参数中出现了struct sigaction的结构,该结构体的成员如下:
参数sa_flags的取值如下:
SA_NOCLDSTOP 子进程停止时不产生SIGCHLD信号
SA_RESETHAND 将对此信号的处理方式在信号处理函数的入口重置为SIG_DFL
SA_RESTART 重启可中断的函数而不是给出EINTR错误
SA_NODEFER 捕获到信号时不将它添加到信号掩码中
例子:
结果如下:
二 等待信号——sigsuspend和sigwait
1 sigsuspend函数
sigsuspend函数用sigmask指向的那个掩码来设置信号掩码,并将进程挂起,直到进程捕捉到信号为止。
2 sigwait函数
sigwait函数一直阻塞到*sigmask指定的任何一个信号被挂起为止,然后从挂起信号集中删除那个信号,并解除对它的阻塞。当sigwait返回时,从挂起信号集中删除的信号的个数被存储在signo指向的那个位置中。
3 sigsuspend和sigwait区别
这两个函数的第一个参数都是指向信号集的指针(sigset_t *)。对sigsuspend来说,这个信号集装载的是新的信号掩码,因此不在信号集中的信号是能使sigsuspend返回的信号。对sigwait来说,这个参数中装载的是需要等待的信号集,因此在信号集中的信号是能使sigwait返回的信号。与sigsuspend不同,sigwait没有改变进程的信号掩码,sigmask中的信号应该在调用sigwait之前被阻塞起来。
一 sigaction函数的作用
定义在接收到参数sig指定的信号后应该采取的行动,声明如下:
#include <signal.h> int sigaction(int sig, //指定动作的信号码 const struct sigaction * act, //说明要采取的动作,如果为NULL,对sigaction的调用就不能改变与信号相关的动作 struct sigaction *oact //负责接收与信号相关的前一个动作,如果为NULL,对sigaction的调用就不会返回与信号相关的前一个动作 );
我们注意到,上面的参数中出现了struct sigaction的结构,该结构体的成员如下:
struct sigaction{ void (*sa_handler)(int); //SIG_DFL,SIG_IGN或者指向函数的指针,SIG_DFL的值说明sigaction应该恢复信号的默认行为, // SIG_IGN的值说明进程应该忽略信号 sigset_t sa_mask; //处理程序的执行过程中需要阻塞的额外的信号 int sa_flags; //特殊的标志符和选项 }
参数sa_flags的取值如下:
SA_NOCLDSTOP 子进程停止时不产生SIGCHLD信号
SA_RESETHAND 将对此信号的处理方式在信号处理函数的入口重置为SIG_DFL
SA_RESTART 重启可中断的函数而不是给出EINTR错误
SA_NODEFER 捕获到信号时不将它添加到信号掩码中
例子:
#include <signal.h> #include <stdio.h> #include <unistd.h> void ouch(int sig){ printf("OUCH! - I got signal %d\n",sig); } int main(){ struct sigaction act; act.sa_handler=ouch; act.sa_flags=0; sigemptyset(&act.sa_mask); sigaction(SIGINT,&act,0); while(1){ printf("Hello world\n"); sleep(1); } }
结果如下:
二 等待信号——sigsuspend和sigwait
1 sigsuspend函数
#include <signal.h> int sigsuspend(const sigset_t *sigmask);
sigsuspend函数用sigmask指向的那个掩码来设置信号掩码,并将进程挂起,直到进程捕捉到信号为止。
2 sigwait函数
#include <signal.h> int sigwait(const sigset_t *restrict sigmask,int *restrict signo);
sigwait函数一直阻塞到*sigmask指定的任何一个信号被挂起为止,然后从挂起信号集中删除那个信号,并解除对它的阻塞。当sigwait返回时,从挂起信号集中删除的信号的个数被存储在signo指向的那个位置中。
3 sigsuspend和sigwait区别
这两个函数的第一个参数都是指向信号集的指针(sigset_t *)。对sigsuspend来说,这个信号集装载的是新的信号掩码,因此不在信号集中的信号是能使sigsuspend返回的信号。对sigwait来说,这个参数中装载的是需要等待的信号集,因此在信号集中的信号是能使sigwait返回的信号。与sigsuspend不同,sigwait没有改变进程的信号掩码,sigmask中的信号应该在调用sigwait之前被阻塞起来。
相关文章推荐
- 在Linux系统环境下修改MySQL的root密码
- Linux core dumps 的调试
- Linux core dumps 的调试
- Linux下C语言编译基础及makefile的编写
- Linux C变成小例子——实现ls命令
- 同一网段中的两台linux A,B; A机设置文件的权限,B通过mount (mount –t nfs ip:/opt/fs /opt/fs)过载A中的文件,无论A机怎样设置文件的权限,B机都可以访
- linux下dns测试命令
- Ubuntu下测试RT-Linux的性能
- linux面试题
- vl4 linuxtv
- Linux 下设置开机自动登录
- Linux查看CPU和内存使用情况
- Linux 服务器故障排除的前五分钟 (First 5 Minutes Troubleshooting A Linux Server)
- linux操作系统初步认识(一)
- Linux软件开发常用命令
- Ubuntu Linux系统的启动过程
- linux 开源项目 交叉编译选项的配置
- CentOS Linux安装RPMForge源
- Davinci DM6446开发攻略——linux-2.6.18移植
- CentOS6.X安装QQ2012