signal
来自cppreference.com
在标头 <signal.h> 定义
|
||
void (*signal( int sig, void (*handler) (int))) (int); |
||
设置信号 sig
的错误处理函数。可将错误处理函数设置为,进行默认处理、忽略信号或调用用户定义函数。
当将信号处理设置为一个函数,而信号出现时,是否立即在信号处理函数开始前调用 signal(sig, SIG_DFL) 是实现定义的。而且,实现可以在信号处理函数运行时阻止某个由实现定义的集合中的信号发生。
参数
sig | - | 设置给信号处理函数的信号。能为实现定义的值或下列值之一:
| ||||||
handler | - | 信号处理函数。必须是下列之一:
|
返回值
成功时返回之前设置的信号处理,失败时为 SIG_ERR(一些实现上能禁用设置信号处理函数)。
信号处理函数
安装为信号处理函数的用户定义函数上,强制了下列限制。
若用户定义函数在处理 SIGFPE、SIGILL 或 SIGSEGV 时返回,则行为未定义。
如果作为 abort 或 raise 的结果调用了信号处理函数,若信号处理函数调用 raise,则行为未定义。
若信号处理函数不是作为 abort 或 raise 的结果调用(换言之,信号处理是异步的),则在下列场合行为未定义
- 信号处理函数调用了任何标准库内的函数,除了
- abort
- _Exit
- quick_exit
- 以当前处理信号的编号为第一实参调用
signal
(异步处理函数可重复注册其自身,但不能注册其他信号)。 - 来自
<stdatomic.h>
的原子函数,若原子参数为免锁 - atomic_is_lock_free(以任何类型的原子实参)
- 除了赋值给静态 volatile sig_atomic_t 对象外,信号处理函数使用任何拥有静态或线程局域 (C11 起)存储期,且非免锁原子的 (C11 起)对象。
进入信号处理函数时,浮点环境状态和所有对象的值是未指定的,除了
- volatile sig_atomic_t 类型的对象
- 免锁原子类型对象 (C11 起)
- 通过 atomic_signal_fence 使之可见的副效应 (C11 起)
从信号处理函数返回时,信号处理函数所修改的任何对象的值,除了 volatile sig_atomic_t 及免锁原子 (C11 起)对象,均为未定义。
若 signal 被用于多线程程序,则行为未定义。不要求它是线程安全的。
注解
POSIX 要求 signal
为线程安全的,而且能从任何信号处理函数调用异步信号安全(async-signal-safe)库函数列表中的函数。
除了 abort
和 raise
外,POSIX 还指定 kill
、pthread_kill
以及 sigqueue
可生成同步信号。
POSIX 推荐用 sigaction
替代 signal
,因为其行为不明确性,以及有关执行信号处理函数时投递信号的严重的实现不一致性。
示例
运行此代码
#include <signal.h> #include <stdio.h> volatile sig_atomic_t gSignalStatus; void signal_handler(int signal) { gSignalStatus = signal; } int main(void) { signal(SIGINT, signal_handler); printf("SignalValue: %d\n", gSignalStatus); printf("Sending signal: %d\n", SIGINT); raise(SIGINT); printf("SignalValue: %d\n", gSignalStatus); }
输出:
SignalValue: 0 Sending signal: 2 SignalValue: 2
引用
- C17 标准(ISO/IEC 9899:2018):
- 7.14.1.1 The signal function (第 193-194 页)
- C11 标准(ISO/IEC 9899:2011):
- 7.14.1.1 The signal function (第 266-267 页)
- C99 标准(ISO/IEC 9899:1999):
- 7.14.1.1 The signal function (第 247-248 页)
- C89/C90 标准(ISO/IEC 9899:1990):
- 4.7.1.1 The signal function
参阅
运行特定信号的信号处理函数 (函数) |