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("捕捉到的信号的编号为 %d\n", num);printf("xxxxxxxxxxxx\n");
}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("1\n");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("捕捉到的信号的编号为 %d\n", num); printf("xxxxxxxxxxxx\n");
}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("1\n");sleep(1);}return 0;
}
尽可能使用sigaction signal是美国那边编译的每个版本不太一样