zoukankan      html  css  js  c++  java
  • 信号_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 }
    使用同一个信号处理函数处理不同的信号的捕获
  • 相关阅读:
    ORA-01861: 文字与格式字符串不匹配
    Tomcat启动失败Unrecognized Windows Sockets error: 0: JVM_Bind
    登陆数据库,界面一直保持正在登陆的状态,oracle使用界面无法登陆
    java.sql.SQLException: 关闭的连接
    如何提高家庭宽带的网速?
    打爆IPv4的不一定是IPv6,可能是中国互联网!
    LibreOffice 7.0.1 发布,开源办公套件
    iPhone12系列售价曝光
    TikTok正式起诉特朗普政府
    WordPress主题ripro 6.6
  • 原文地址:https://www.cnblogs.com/doitjust/p/12657865.html
Copyright © 2011-2022 走看看