信号_signal函数

1.函数原型

SYNOPSIS
       #include <signal.h>

       typedef void (*sighandler_t)(int);

       sighandler_t signal(int signum, sighandler_t handler);

(1) 功能

  设置某个信号的处理方式

  • 处理方式可以被设置为忽略、捕获或默认。

  • 进程的进程表(task_struct)中会有一个“信号处理方式登记表”,专门用于记录信号的处理方式,调用signal函数设置某个信号的处理方式时,会将信号的处理方式登记到该表中。

  • 每个进程拥有独立的task_struct结构体变量,因而每个进程的“信号处理方式登记表”都是独立的,所以每个进程对信号的处理方式自然也是独立的,互补干扰的。

(2)参数

  • 1) signum:信号编号
  • 2) handler:信号处理方式
    • sighandler_t是被typedef后的类型,原型为一个函数指针类型,void (*)(int) 。

    • sighandler_t handler 也可以直接写成 void (*handler)(int)。

    • sighanler_t signal(int signum,void (*handler)(int))

    • (a) 忽略:SIG_IGN

    • (b) 默认:SIG_DFL

    • (c) 捕获:填写类型为 void (*)(int) 的捕获函数的地址。当信号发生时,会自动调用捕获函数来进行相应的处理。

      • 当然这个捕获函数需要我们自己来实现,捕获函数的int参数,用于接收信号编号
      • 捕获函数也被称为信号处理函数
      •  1 void signal_fun1(int signo)
         2 {
         3     ......
         4 }
         5 
         6 void signal_fun2(int signo)
         7 {
         8     .......
         9 }
        10 
        11 int main(void)
        12 {
        13     signal(SIGINT,signal_fun1);
        14     signal(SIGSEGV,signal_fun2);
        15 
        16     return 0;
        17 }
        捕获函数代码例子
  • 捕获函数什么时候被调用?
    •   进程接收到信号时就被调用,调用时会中断进程的正常运行,当调用完毕后再会返回进程的征程进行。

(3)返回值

  • 成功:返回上一次的处理方式
  • 失败:返回SIG_ERR宏值

2.代码演示

例子1:信号有默认处理方式,这里重新设置SIGINT信号的处理方式

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <signal.h>
 4 
 5 int main(int argc,char **argv)
 6 {
 7     signal(SIGINT,SIG_IGN);
 8 
 9     while(1);
10 
11     return 0;
12 }
 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <signal.h>
 4 
 5 int main(int argc,char **argv)
 6 {
 7     signal(SIGINT,SIG_IGN);    //设置信号处理放方式为忽略
 8     signal(SIGINT,SIG_DFL);    //还原为默认处理方式
 9 
10     while(1);
11 
12     return 0;
13 }
通过重新设置来还原信号的处理方式
 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <signal.h>
 4 
 5 
 6 /*信号处理函数
 7 */
 8 void signal_fun1(int signo)
 9 {
10     printf("SIGINT signo = %d 
",signo);    
11 }
12 
13 int main(int argc,char **argv)
14 {
15     signal(SIGINT,SIG_IGN);        //设置信号处理放方式为忽略
16     signal(SIGINT,SIG_DFL);        //还原为默认处理方式
17     signal(SIGINT,signal_fun1);    //设置信号处理方式为捕获
18     while(1);
19 
20     return 0;
21 }
设置信号处理方式为捕获的例子
 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <signal.h>
 4 
 5 
 6 /*信号处理函数
 7 */
 8 void singal_fun(int signo)
 9 {
10     if(signo == SIGINT)
11     {
12         printf("SIGINT signo = %d 
",signo);
13     }else if(signo == SIGQUIT)
14     {
15         printf("SIGQUIT signo = %d 
",signo);    
16     }
17 }
18 
19 
20 int main(int argc,char **argv)
21 {
22     signal(SIGINT,SIG_IGN);        //设置信号处理放方式为忽略
23     signal(SIGINT,SIG_DFL);        //还原为默认处理方式
24     signal(SIGINT,signal_fun);    //设置信号处理方式为捕获
25 
26     signal(SIGQUIT,SIG_IGN);        //设置信号处理放方式为忽略
27     signal(SIGQUIT,SIG_DFL);        //还原为默认处理方式
28     signal(SIGQUIT,signal_fun);
29 
30     while(1);
31 
32     return 0;
33 }
使用同一个信号处理函数处理不同的信号的捕获
原文地址:https://www.cnblogs.com/doitjust/p/12657865.html