#include <signal.h>
int sigaction(int signum, const struct sigaction *act,
struct sigaction *oldact);
//The sigaction() system call is used to change the action taken by a process on receipt of a specific signal.
sigaction()系统调用用于改变进程在接收到特定信号时所采取的操作。
参数:
signum:signum指定信号,可以是除SIGKILL和SIGSTOP之外的任何有效信号。
act:如果act不为null,信号signum的新操作将使用act。如果oldact为非null,则上一个动作保存在oldact中。
oldact:上一次对信号捕捉相关设置,一般不使用,设置为NULL。
sigaction结构体定义如下:
struct sigaction {
void (*sa_handler)(int);
void (*sa_sigaction)(int, siginfo_t *, void *);
sigset_t sa_mask;
int sa_flags;
void (*sa_restorer)(void);
};
其中:
sa_handler: 表示收到信号时的处理函数,可为
* SIG_DFL for the default action.(默认处理方法)
* SIG_IGN to ignore this signal.(忽略信号不处理)
* A pointer to a signal handling function(自己定义的处理函数). This function receives the signal
number as its only argument.
sa_mask: 表示处理该信号时的一个临时阻塞信号集(集合中为1的信号暂时挂起不处理)
sa_flags: 表示使用哪个信号处理对捕捉信号进行处理,值为0时表示使用sa_handler处理,值为SA_SIGINFO则使用sa_sigaction处理。
实例:
//不加这个宏定义sigaction结构实例会报错 (incomplete type is not allowed)
#define _XOPEN_SOURCE
#include<sys/time.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
void my_fun(int signum){
printf("everything is ok\n");
}
int main(){
struct sigaction act;
act.sa_handler = my_fun;
act.sa_flags =0;
//清空临时阻塞信号集,建立的默认阻塞信号集可能有值为1
sigemptyset(&act.sa_mask);
sigaction(SIGALRM,&act,NULL);
struct itimerval it,oldit;
it.it_interval.tv_sec=3;
it.it_interval.tv_usec=0;
it.it_value.tv_sec =5;
it.it_value.tv_usec = 0;
setitimer(ITIMER_REAL,&it,&oldit);
while(1);
return 0;
}
输出结果: