本文主要参考《unix环境高级编程》
sigaction函数的功能是检查或修改与指定信号相关联的处理动作(可同时两种操作)。
int sigaction(int signo,const struct sigaction *restrict act,
struct sigaction *restrict oact);
|
结构sigaction定义如下:
struct sigaction{ void (*sa_handler)(int); sigset_t sa_mask; int sa_flag; void (*sa_sigaction)(int,siginfo_t *,void *); };
|
sa_handler字段包含一个信号捕捉函数的地址
sa_mask字段说明了一个信号集,在调用该信号捕捉函数之前,这一信号集要加进进程的信号屏蔽字中。仅当从信号捕捉函数返回时再将进程的信号屏蔽字复位为原先值。
sa_flag是一个选项,主要理解两个
SA_INTERRUPT 由此信号中断的系统调用不会自动重启 SA_RESTART 由此信号中断的系统调用会自动重启
SA_SIGINFO 提供附加信息,一个指向siginfo结构的指针以及一个指向进程上下文标识符的指针
|
最后一个参数是一个替代的信号处理程序,当设置SA_SIGINFO时才会用他,具体有些烦,暂时用不到,不看了。
下面的代码是用sigaction实现signal函数:
#include "apue.h" Sigfunc *signal(int signo,Sigfunc *func) { struct sigaction act;//新的信号关联信息
struct sigaction oact;//老的信号关联信息
act.sa_handler = func;//新的信号处理函数
sigemptyset(&act.sa_mask);//初始化屏蔽字
act.sa_flags = 0;//初始化flags
if (signo == SIGALRM) {//不会重启动 #ifdef SA_INTERRUPT act.sa_flags |= SA_INERRUPT; #endif } else { //重启动 #ifdef SA_RESTART act.sa_flags |= SA_RESTART; #endif } if (sigaction(signo, &act, &oact) < 0)//新老交换 return(SIG_ERR); return (oact.sa_handler); }
|
阅读(3684) | 评论(1) | 转发(0) |