信号(七)信号捕捉
发布时间
阅读量:
阅读量
一、利用signal函数来简单捕捉信号
#include <signal.h>
typedef void (*sighandler_t)(int); //定义一个函数指针类型,其中函数的返回值为void,函数参数为int;其实一个函数的函数名就是函数指针
sighandler_t signal(int signum, sighandler_t handler);
//函数返回值:signal() returns the previous value of the signal handler, or SIG_ERR on error.
In the event of an error, errno is set to indicate the cause.
该函数包含两个参数。其中signum字段表示要捕获的信号编号。同样地,在这种情况下建议传递与所捕获信号编号相对应的宏名名称。这样做可以让代码在不同平台上运行而无需进行任何修改。第二个参数是一个指针变量,在捕获该信号时就会触发执行相应的逻辑。

用signal函数实现简单信号捕获示例:
#include<stdio.h>
#include<signal.h>
#include<unistd.h>
#include<stdlib.h>
typedef void (*sighandler_t)(int);
void handler(int signo){ //这里是一个回调函数,系统收到了SIGINT信号后,会陷入内核。
printf("No.%d signal cached!!\n",signo);
}
int main(){
sighandler_t sighandler;
sighandler=signal(SIGINT,handler);
if(sighandler==SIG_ERR){
perror("signal error");
exit(1);
}
while(1); //这里让进程循环等待接收信号
return 0;
}
二、用sigaction函数来捕抓信号
#include <signal.h>
int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);
struct sigaction {
void (*sa_handler)(int);
void (*sa_sigaction)(int, siginfo_t *, void *);
sigset_t sa_mask;
int sa_flags;
void (*sa_restorer)(void);
};
函数解析过程:其中signum为需要捕获的关键信号;act接收输入参数并决定其处理策略;oldact则记录着该信号原有的处理策略。
全部评论 (0)
还没有任何评论哟~
