C语言 <signal.h> signal 函数

  • 描述

    C库函数void(* signal(int sig,void(* func)(int)))(int)设置处理信号的函数,即信号编号为sig的信号处理程序。
  • 声明

    以下是signal函数的声明。
    
    void (*signal(int sig, void (*func)(int)))(int)
    
    参数
    • sig - 这是要发送的信号号。以下是一些重要的标准信号常数-
      • SIGABRT - (信号中止)异常终止,如由函数启动。
      • SIGFPE - (信号浮点异常)错误的算术运算,如除零或导致溢出的运算(不一定是浮点运算)。
      • SIGILL - (信号非法指令)无效的函数图像,如非法指令。这通常是由于代码损坏或试图执行数据造成的。
      • SIGINT - (信号中断)交互注意信号。通常由应用程序用户生成。
      • SIGSEGV - (信号分割冲突)对存储器的无效访问——当程序试图在分配给它的内存之外读写时。
      • SIGTERM - (信号终止)发送给程序的终止请求。
    • func - 这是指向函数的指针。这可以是程序员定义的功能,也可以是以下预定义功能之一。
      • SIG_DFL - 默认处理-该信号由该特定信号的默认操作处理。
      • SIG_IGN - 忽略信号-信号被忽略。
  • 返回值

    此函数返回信号处理程序的先前值,如果出错则返回SIG_ERR。
    示例
    以下示例显示signal函数的用法-
    
    #include <stdio.h>
    #include <unistd.h>
    #include <stdlib.h>
    #include <signal.h>
    
    void sighandler(int);
    
    int main () {
       signal(SIGINT, sighandler);
    
       while(1) {
          printf("Going to sleep for a second...\n");
          sleep(1); 
       }
       return(0);
    }
    
    void sighandler(int signum) {
       printf("Caught signal %d, coming out...\n", signum);
       exit(1);
    }
    
    让我们编译并运行上述程序,它将产生以下结果,并且程序将进入无限循环。为了使用该程序,我们使用了CTRL + C键。
    
    Going to sleep for a second...
    Going to sleep for a second...
    Going to sleep for a second...
    Going to sleep for a second...
    Going to sleep for a second...
    Caught signal 2, coming out...