天天看点

UNIX环境高级编程笔记(13)- 函数sigaction前言一、struct sigaction结构体二、sigaction函数三、signal函数实现总结

前言

本文章主要介绍函数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函数。

继续阅读