当前位置: C语言 -- 标准库 -- <signal.h> -- signal

signal函数


概要:
#include <signal.h>
void (*signal(int sig, void (*func)(int)))(int);

描述:

该函数给参数sig表示的信号指定信号处理函数,通常有以下三种方式:

1、如果参数funcSIG_DFL,将使用默认处理函数处理信号。

2、如果参数funcSIG_IGN,信号将被忽略。

3、如果参数func为函数指针,出现信号时,将调用参数func指向的函数处理信号。


当出现信号并且参数func指向函数时,由实现定义是执行signal(sig, SIG_DFL);的等价语句,还是阻止某些实现定义的信号(至少包括sig)发生,直至当前信号处理完;出现SIGILL信号的情况下,实现可以不采取任何行动;然后执行(*func)(sig);的等价语句;函数返回时,如果参数sig的值为SIGFPESIGILLSIGSEGV或者其它实现定义的与计算异常相关的值,则行为是未定义的;否则程序将在中断点恢复执行。


如果信号是由于调用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函数一样。


参数:
int sig

信号值,ISO/IEC 9899:2018标准定义了以下信号宏:

对应术语 描述
SIGABRT abort 异常终止,例如:调用abort函数引发的异常终止。
SIGFPE floating-point exception 错误的算术运算,例如:除以0或者导致溢出的运算。
SIGILL illegal instruction 检测到无效函数映像,例如:无效指令。
SIGINT interrupt 收到交互式注意信号。
SIGSEGV segmentation violation 对存储的无效访问。
SIGTERM termination 发送给程序的终止请求。

具体实现还可能定义以SIG和一个大写字母或者SIG_和一个大写字母开头的信号宏。


void (*func)(int)

一个指向函数的指针,所指函数是一个信号处理函数,它应该为以下情况之一:

1、宏SIG_DFL

2、宏SIG_IGN

3、自定义函数,该函数应具有以下原型:

void func(int sig);


返回值:

如果请求能够得到满足,函数将为指定信号sig返回最近一次成功调用signal函数时参数func的值;否则函数返回宏SIG_ERR,并将一个正值存入宏errno


范例:
1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
/*函数signal范例*/

#include <signal.h>
#include <stdio.h>

sig_atomic_t signalStatus = 0;

void signalHandler(int parameter)
{
    signalStatus = parameter;
}

int main(void)
{
    signal(SIGINT, signalHandler);
    raise(SIGINT);
    printf("signalStatus: %d\n", signalStatus);

    return 0;
}


输出:

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 发送信号函数。