signal函数
概要:
#include <signal.h> void (*signal(int sig, void (*func)(int)))(int);
描述:
该函数给参数sig表示的信号指定信号处理函数,通常有以下三种方式:
1、如果参数func为SIG_DFL,将使用默认处理函数处理信号。
2、如果参数func为SIG_IGN,信号将被忽略。
3、如果参数func为函数指针,出现信号时,将调用参数func指向的函数处理信号。
当出现信号并且参数func指向函数时,由实现定义是执行signal(sig, SIG_DFL);的等价语句,还是阻止某些实现定义的信号(至少包括sig)发生,直至当前信号处理完;出现SIGILL信号的情况下,实现可以不采取任何行动;然后执行(*func)(sig);的等价语句;函数返回时,如果参数sig的值为SIGFPE、SIGILL、SIGSEGV或者其它实现定义的与计算异常相关的值,则行为是未定义的;否则程序将在中断点恢复执行。
如果信号是由于调用abort函数或者raise函数引起,则信号处理程序不应调用raise函数。
如果信号不是调用abort函数或者raise函数引起,下述行为是未定义的:
1、如果信号处理程序引用静态存储期限或者线程存储期限的对象(该对象不是锁无关原子对象。);而不是通过向声明为volatile sig_atomic_t的对象赋值。
2、信号处理程序调用了除下述函数外的标准库函数:
- abort函数;
- _Exit函数;
- quick_exit函数;
- 原子参数锁无关时,<stdatomic.h>头文件中声明的函数(除非另有明确说明。);
- 具有原子参数的atomic_is_lock_free函数;
- signal函数,该函数的第一个参数等于信号编号,该信号编号对应的信号是导致调用处理程序的信号。如果对signal函数的调用返回宏SIG_ERR,宏errno的值是不确定的。如果任何信号由异步信号处理程序生成,则行为是未定义的。
程序启动时,可以对一些以实现定义的方式选择的信号执行与signal(sig, SIG_IGN);语句等价的语句;对实现定义的所有其它信号执行与signal(sig, SIG_DFL);语句等价的语句。
在多线程程序中使用signal函数会导致未定义行为。实现应像没有库函数调用signal函数一样。
参数:
信号值,ISO/IEC 9899:2018标准定义了以下信号宏:
宏 | 对应术语 | 描述 |
SIGABRT | abort | 异常终止,例如:调用abort函数引发的异常终止。 |
SIGFPE | floating-point exception | 错误的算术运算,例如:除以0或者导致溢出的运算。 |
SIGILL | illegal instruction | 检测到无效函数映像,例如:无效指令。 |
SIGINT | interrupt | 收到交互式注意信号。 |
SIGSEGV | segmentation violation | 对存储的无效访问。 |
SIGTERM | termination | 发送给程序的终止请求。 |
具体实现还可能定义以SIG和一个大写字母或者SIG_和一个大写字母开头的信号宏。
一个指向函数的指针,所指函数是一个信号处理函数,它应该为以下情况之一:
1、宏SIG_DFL。
2、宏SIG_IGN。
3、自定义函数,该函数应具有以下原型:
void func(int sig);
返回值:
如果请求能够得到满足,函数将为指定信号sig返回最近一次成功调用signal函数时参数func的值;否则函数返回宏SIG_ERR,并将一个正值存入宏errno。
范例:
|
|
输出:
signalStatus: 2
GCC编译器<signal.h>头文件中,不同信号的信号值定义如下:
#define SIGINT 2
#define SIGILL 4
#define SIGFPE 8
#define SIGSEGV 11
#define SIGTERM 15
#define SIGBREAK 21
#define SIGABRT 22
相关内容:
sig_atomic_t | 对象整数类型。 |
raise | 发送信号函数。 |