C语言库signal.h操作

时间:2022-02-13 14:13:43
signal.h
signal.h 头文件定义了一个变量类型 sig_atomic_t两个函数调用一些宏来处理程序执行期间报告的不同信号


signal.h 中定义的【变量类型】
sig_atomic_t 这是 int 类型,在信号处理程序中作为变量使用。
它是一个对象的整数类型,该对象可以作为一个原子实体访问,即使存在异步信号时,该对象可以作为一个原子实体访问。



下面是头文件 signal.h 中定义的【宏】,这些宏将在下列两个函数中使用。
SIG_ 宏与 signal 函数一起使用来定义信号的功能
1SIG_DFL 默认的信号处理程序。
2SIG_ERR 表示一个信号错误。
3SIG_IGN 忽视信号。

SIG 宏用于表示以下各种条件的信号码:
1SIGABRT 程序异常终止。
2SIGFPE 算术运算出错,如除数为 0 或溢出。
3SIGILL 非法函数映象,如非法指令。
4SIGINT 中断信号,如 ctrl-C。
5SIGSEGV 非法访问存储器,如访问不存在的内存单元。
6SIGTERM 发送给本程序的终止请求信号。


信号量与对应值
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL10) SIGUSR1
11) SIGSEGV12) SIGUSR213) SIGPIPE14) SIGALRM15) SIGTERM
16) SIGSTKFLT17) SIGCHLD18) SIGCONT19) SIGSTOP20) SIGTSTP
21) SIGTTIN22) SIGTTOU23) SIGURG24) SIGXCPU25) SIGXFSZ
26) SIGVTALRM27) SIGPROF28) SIGWINCH29) SIGIO30) SIGPWR
31) SIGSYS34) SIGRTMIN35) SIGRTMIN+136) SIGRTMIN+237) SIGRTMIN+3
38) SIGRTMIN+439) SIGRTMIN+540) SIGRTMIN+641) SIGRTMIN+742) SIGRTMIN+8
43) SIGRTMIN+944) SIGRTMIN+1045) SIGRTMIN+1146) SIGRTMIN+1247) SIGRTMIN+13
48) SIGRTMIN+1449) SIGRTMIN+1550) SIGRTMAX-1451) SIGRTMAX-1352) SIGRTMAX-12
53) SIGRTMAX-1154) SIGRTMAX-1055) SIGRTMAX-956) SIGRTMAX-857) SIGRTMAX-7
58) SIGRTMAX-659) SIGRTMAX-560) SIGRTMAX-461) SIGRTMAX-362) SIGRTMAX-2
63) SIGRTMAX-164) SIGRTMAX

库函数
下面是头文件 signal.h 中定义的【函数】
1void (*signal(int sig, void (*func)(int)))(int) 该函数设置一个函数来处理信号,即信号处理程序。
2int raise(int sig) 该函数会促使生成信号 sig。sig 参数与 SIG 宏兼容。


1.void (*signal(int sig, void (*func)(int)))(int【捕获到的信号值】) void (*signal(int sig, void (*func)(int)))(int) 设置一个函数来处理信号,即带有 sig 参数的信号处理程序sig -- 在信号处理程序中作为变量使用的信号码。下面是一些重要的标准信号常量:func -- 一个指向函数的指针。它可以是一个由程序定义的函数,也可以是下面预定义函数之一该函数返回信号处理程序之前的值,当发生错误时返回 SIG_ERRSIGABRT(Signal Abort) 程序异常终止。SIGFPE(Signal Floating-Point Exception) 算术运算出错,如除数为 0 或溢出(不一定是浮点运算)。SIGILL(Signal Illegal Instruction) 非法函数映象,如非法指令,通常是由于代码中的某个变体或者尝试执行数据导致的。SIGINT(Signal Interrupt) 中断信号,如 ctrl-C,通常由用户生成。SIGSEGV(Signal Segmentation Violation) 非法访问存储器,如访问不存在的内存单元。SIGTERM(Signal Terminate) 发送给本程序的终止请SIG_DFL默认的信号处理程序。SIG_IGN忽视信号。#include <stdio.h>#include <unistd.h>#include <stdlib.h>#include <signal.h>void sighandler(int);int main(){   signal(SIGINT, sighandler);   while(1)    {      printf("开始休眠一秒钟...\n");      sleep(1);   }   return(0);}void sighandler(int signum){   printf("捕获信号 %d,跳出...\n", signum);   exit(1);}打印结果:【程序会进入无限循环,需使用 CTRL + C 键跳出程序】开始休眠一秒钟...开始休眠一秒钟...开始休眠一秒钟...开始休眠一秒钟...开始休眠一秒钟...捕获信号 2,跳出...
2.int raise(int sig) int raise(int sig) 会促使生成信号 sig。sig 参数与 SIG 宏兼容。sig -- 要发送的信号码。下面是一些重要的标准信号常量:如果成功该函数返回零,否则返回非零。SIGABRT(Signal Abort) 程序异常终止。SIGFPE(Signal Floating-Point Exception) 算术运算出错,如除数为 0 或溢出(不一定是浮点运算)。SIGILL(Signal Illegal Instruction) 非法函数映象,如非法指令,通常是由于代码中的某个变体或者尝试执行数据导致的。SIGINT(Signal Interrupt) 中断信号,如 ctrl-C,通常由用户生成。SIGSEGV(Signal Segmentation Violation) 非法访问存储器,如访问不存在的内存单元。SIGTERM(Signal Terminate) 发送给本程序的终止请#include <stdio.h>#include <unistd.h>#include <stdlib.h>#include <signal.h>void signal_catchfunc(int);int main(){    int ret;   ret = signal(SIGINT, signal_catchfunc);   if( ret == SIG_ERR)    {      printf("错误:不能设置信号处理程序。\n");      exit(0);   }   printf("开始生成一个信号\n");   ret = raise(SIGINT); // 产生信号量   if( ret !=0 )    {      printf("错误:不能生成 SIGINT 信号。\n");      exit(0);   }   printf("退出...\n");   return(0);}void signal_catchfunc(int signal){   printf("!! 信号捕获 !!\n");}打印结果:开始生成一个信号!! 信号捕获 !!退出...