前言
本文章主要介绍函数sigaction及其参数。
一、struct sigaction结构体
struct sigaction{
void (*sa_handler)(int);
sigset_t sa_mask;
int sa_flags;
void (*sa_sigaction)(int,siginfo *,void *);
};
其中,当更改信号动作时,sa_handler字段包括了一个信号捕捉函数的地址;
sa_mask字段说明了一个信号集,在调用该信号捕捉函数之前,这一信号集要加到信号的屏蔽字中;
sa_flags字段指定了对信号进行处理的各个选项,取值为:SA_INTERRUPT SA_NOCLDSTOP SA_NOCLDWAIT SA_NODEFER SA_ONSTACK SA_RESETHAND SA_RESTART SA_SIGINFO;
sa_sigation字段是一个替代的信号处理程序,在sigaction结构中使用了SA_SIGINFO标志时,使用该信号处理程序。对于sa_sigaction字段和sa_handler字段,是能使用两个中的一个;
通常按下面方式调用信号处理程序:void handler(int signo);
但是,如果设置了SA_SIGINFO标志,那么按照 下面方式调用信号处理程序:void handler(int signo,siginfo_t *info,void *context);
struct siginfo{
int si_signo;
int si_error;
int si_code;
pid_t si_pid;
uid_t si_uid;
void *si_addr;
int si_status;
union sigval si_value;
};
union sigval{
int sival_int;
void *sival_ptr;
}
二、sigaction函数
#include <signal.h>
int sigaction(int signo, const struct sigaction *restrict act,struct sigaction *restrict oact);
其中signo是要检测或者修改其具体动作的信号编号。若act指针非空,则要修改其动作。如果oact指针非空,则系统经由oact指针返回该信号的上一个动作。
三、signal函数实现
1.用sigaction函数实现signal函数
代码如下(示例):
typedef void Sigfunc(int);
Sigfunc * my_signal(int signo,Sigfunc *func)
{
struct sigaction act,oact;
act.sa_handler = func;
sigemptyset(&act.sa_mask);
act.sa_flags = 0;
if(signo == SIGALRM){
#ifdef SA_INTERRUPT
act.sa_flags |= SA_INTERRUPT;
#endif
}else{
act.sa_flags |= SA_RESTART;
}
if(sigaction(signo,&act,&oact) < 0)
return SIG_ERR;
return oact.sa_handler;
}
总结
本章主要介绍了sigaction函数和struct sigaction结构体以及用函数sigaction实现signal函数。