Advertisement

信号(七)信号捕捉

阅读量:

一、利用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)

还没有任何评论哟~