signal
来自 cppreference.cn
定义于头文件 <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(带有任何类型的原子参数)
- 信号处理程序引用任何具有静态 或线程局部(C11 起) 存储期 的对象 ,该对象不是无锁的 原子类型(C11 起),除非是通过赋值给静态的 volatile sig_atomic_t。
在进入信号处理程序时,浮点环境的状态和所有对象的值都未指定,除了
- 类型为 volatile sig_atomic_t 的对象
- 无锁原子类型的对象 (C11 起)
- 通过 atomic_signal_fence 可见的副作用 (C11 起)
从信号处理程序返回后,信号处理程序修改的任何对象的,如果它不是 volatile sig_atomic_t 或无锁原子类型(C11 起),则其值未定义。
如果在多线程程序中使用 signal,则行为未定义。它不要求是线程安全的。
[编辑] 注解
POSIX 要求 signal
是线程安全的,并且 指定了可以从任何信号处理程序调用的异步信号安全库函数列表。
除了 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 signal 函数 (p: 193-194)
- C11 标准 (ISO/IEC 9899:2011)
- 7.14.1.1 signal 函数 (p: 266-267)
- C99 标准 (ISO/IEC 9899:1999)
- 7.14.1.1 signal 函数 (p: 247-248)
- C89/C90 标准 (ISO/IEC 9899:1990)
- 4.7.1.1 signal 函数
[编辑] 参见
为特定信号运行信号处理程序 (函数) | |
C++ 文档 关于 signal
|