signal
在头文件<signal.h>中定义 | | |
---|---|---|
void(* signal(int sig,void(* handler)(int)))(int); | | |
设置信号sig的错误处理程序。 可以设置信号处理程序,以便进行默认处理,忽略信号或调用用户定义的函数。
当信号处理程序设置为函数并且发生信号时,会执行定义信号处理程序启动之前是否立即执行signal(sig,SIG_DFL)。 此外,该实现可以防止在信号处理程序运行时发生一些实现定义的信号集。
参数
sig | - | 将信号处理程序设置为的信号。它可以是实现定义的值或以下值之一:SIGABRTSIGFPESIGILLSIGINTSIGSEGVSIGTERM定义信号类型(宏常量) | SIGABRTSIGFPESIGILLSIGINTSIGSEGVSIGTERM | 定义信号类型(宏常量) | |
---|---|---|---|---|---|
SIGABRTSIGFPESIGILLSIGINTSIGSEGVSIGTERM | 定义信号类型(宏常量) | ||||
handler | - | 信号处理程序。这必须是以下之一:SIG_DFL宏。信号处理程序设置为默认信号处理程序。SIG_IGN宏。信号被忽略。指向函数的指针。该函数的签名必须等同于以下内容:void fun(int sig); | void fun(int sig); | | |
void fun(int sig); | | |
SIG_DFL
宏。信号处理程序设置为默认信号处理程序。SIG_IGN
宏。信号被忽略。- 指向函数的指针。该功能的签名必须等同于以下内容:
void fun(int sig);
返回值
成功则返回先前的信号处理程序,或失败时返回SIG_ERR(在某些实现中可以禁用信号处理程序)。
信号交易
作为信号处理程序安装的用户定义函数受到以下限制。
如果用户定义的函数在处理时返回SIGFPE
,SIGILL
或者SIGSEGV
则行为未定义。
如果信号处理程序由于中止或提升而被调用,那么如果信号处理程序调用提升,则行为不确定。
如果信号处理程序由于中止或提升而被调用(换句话说,信号处理程序是异步的),则行为是不确定的。
- 信号处理程序调用标准库中的任何函数,以下情况除外
abort
_Exit
quick_exit
signal
第一个参数是当前处理的信号的数量(异步处理程序可以重新注册自身,但不是其他信号)。- 如果原子参数是无锁的,则从stdatomic.h派生原子函数
atomic_is_lock_free
(有任何种类的原子参数)
- 信号处理程序引用任何静态或线程本地(自C11)存储持续时间的非锁定原子(自C11开始)以外的任何对象,而不是通过分配给静态
volatile std::sig_atomic_t
。
在进入信号处理程序时,浮点环境的状态和所有对象的值是未指定的,除了。
- 类型的对象
volatile
sig_atomic_t
- 无锁原子类型的对象(自C11开始)
- 通过
atomic_signal_fence
(自C11以来)可见的副作用
从信号处理程序返回时,由信号处理程序修改的非易失性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
参考
- C11标准(ISO / IEC 9899:2011):
- 7.14.1.1信号功能(p:266-267)
- C99标准(ISO / IEC 9899:1999):
- 7.14.1.1信号功能(p:247-248)
- C89 / C90标准(ISO / IEC 9899:1990):
- 4.7.1.1信号功能
扩展内容
raise | runs the signal handler for particular signal (function) |
---|
| signal的C ++文档 |
本文档系腾讯云开发者社区成员共同维护,如有问题请联系 cloudcommunity@tencent.com