Linux 信号捕捉函数 signal sigaction
signal函数
#include <signal.h>
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);
功能:设置某个信号的捕捉行为
参数:
-signum:要捕捉的信号
handler:对捕捉到的信号怎么处理
-SIG_IGN:忽略信号
-SIG_DFL:使用函数默认的行为
-回调函数,程序员只负责写,捕捉到信号后如何区处理
-需要程序员实现,提前准备好的,函数的类型根据实际需求,看函数指针的定义
-不是程序员调用,而是当信号产生,内核调用
-函数指针是实现回调的手段,函数实现之后,将函数名放到函数指针的位置就好了
返回值:
成功:返回上一次注册的信号处理函数的地址。第一次调用返回NULL
失败:返回SIG_ERR,设置错误号
SIGKILL 和 SIGSTOP不能被捕捉也不能被忽略
*/
#include <sys/time.h>
#include<stdio.h>
#include<unistd.h>
#include<signal.h>
void myalarm(int num) {
printf("捕捉到的信号的编号为 %dn", num);
printf("xxxxxxxxxxxxn");
}
int main() {
signal(SIGALRM, myalarm);
struct itimerval new_value;
new_value.it_interval.tv_sec = 2;
new_value.it_interval.tv_usec = 0;
new_value.it_value.tv_sec = 3;
new_value.it_value.tv_usec = 0;
int ret = setitimer(ITIMER_REAL, &new_value, NULL);
printf("开始n");
if(ret == -1) {
perror("ret");
return 0;
}
while(1) {
printf("1n");
sleep(1);
}
return 0;
}
sigaction函数
#include <signal.h>
int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);
功能:检查或者改变信号的处理 信号捕捉
参数:-signum:要捕捉的信号的编号或者宏值
-act 捕捉到信号之后的处理动作
-oldact:上一次对信号捕捉相关的设置,一般不用,输入NULL
返回值:成功0失败-1
struct sigaction {
void (*sa_handler)(int); 函数指针,指向的函数就是信号捕捉到之后的处理函数
void (*sa_sigaction)(int, siginfo_t *, void *); 不常用 同上
sigset_t sa_mask; 临时阻塞信号集,在信号捕捉函数执行过程中阻塞某些信号
int sa_flags; 指定是使用第一个参数还是第二个参数对信号进行处理 0表示使用sa_handler siginfo表示第二个
void (*sa_restorer)(void);
};
#include <sys/time.h>
#include<stdio.h>
#include<unistd.h>
#include<signal.h>
void myalarm(int num) {
printf("捕捉到的信号的编号为 %dn", num);
printf("xxxxxxxxxxxxn");
}
int main() {
struct sigaction act;
act.sa_handler = 0;
act.sa_handler = myalarm;
sigemptyset(&act.sa_mask);
sigaction(SIGALRM, &act, NULL);
struct itimerval new_value;
new_value.it_interval.tv_sec = 2;
new_value.it_interval.tv_usec = 0;
new_value.it_value.tv_sec = 3;
new_value.it_value.tv_usec = 0;
int ret = setitimer(ITIMER_REAL, &new_value, NULL);
printf("开始n");
if(ret == -1) {
perror("ret");
return 0;
}
while(1) {
printf("1n");
sleep(1);
}
return 0;
}
尽可能使用sigaction signal是美国那边编译的每个版本不太一样