命名空间
变体
操作

signal

来自 cppreference.cn
< c‎ | program
定义于头文件 <signal.h>
void (*signal( int sig, void (*handler) (int))) (int);

设置信号 sig 的错误处理器。信号处理器可以设置为默认处理、忽略信号或调用用户定义函数。

当信号处理器设置为函数并且信号发生时,在信号处理器启动之前是否立即执行 signal(sig, SIG_DFL) 是实现定义的。此外,在信号处理器运行时,实现可以阻止某些实现定义的信号集发生。

目录

[编辑] 参数

sig - 要设置信号处理器的信号。它可以是实现定义的值或以下值之一
定义信号类型
(宏常量) [编辑]
处理程序 - 信号处理器。这必须是以下之一
  • SIG_DFL 宏。信号处理器设置为默认信号处理器。
  • SIG_IGN 宏。信号被忽略。
  • 指向函数的指针。函数的签名必须等同于以下
void fun(int sig);

[编辑] 返回值

成功时返回先前的信号处理器,失败时返回 SIG_ERR(在某些实现上可能禁用设置信号处理器)。

[编辑] 信号处理器

对作为信号处理器安装的用户定义函数施加以下限制。

如果用户定义函数在处理 SIGFPESIGILLSIGSEGV 时返回,则行为未定义。

如果信号处理器是由于 abortraise 而被调用的,并且信号处理器又调用了 raise,则行为未定义。

如果信号处理器不是由于 abortraise 而被调用的(换句话说,信号处理器是异步的),则行为未定义,如果

  • 信号处理器调用标准库中的任何函数,除了
  • abort
  • _Exit
  • quick_exit
  • signal,其第一个参数是当前正在处理的信号编号(异步处理器可以重新注册自身,但不能注册其他信号)。
  • 来自 <stdatomic.h> 的原子函数,如果原子参数是无锁的。
  • atomic_is_lock_free(使用任何类型的原子参数)
  • 信号处理器引用任何具有静态 或线程局部(从 C11 开始) 存储期 的对象,如果它不是无锁的 原子 对象(从 C11 开始),除非通过赋值给静态 volatile sig_atomic_t

进入信号处理器时,浮点环境的状态和所有对象的值都是未指定的,除了

从信号处理器返回时,任何由信号处理器修改的、不是 volatile sig_atomic_t 或无锁原子(从 C11 开始) 的对象的值都是未定义的。

如果在多线程程序中使用 signal,则行为未定义。它不要求是线程安全的。

[编辑] 注意

POSIX 要求 signal 是线程安全的,并 指定了一份异步信号安全库函数列表,这些函数可以从任何信号处理器中调用。

除了 abortraise,POSIX 规定 killpthread_killsigqueue 会生成同步信号。

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 (p: 193-194)
  • C11 标准 (ISO/IEC 9899:2011)
  • 7.14.1.1 The signal function (p: 266-267)
  • C99 标准 (ISO/IEC 9899:1999)
  • 7.14.1.1 The signal function (p: 247-248)
  • C89/C90 标准 (ISO/IEC 9899:1990)
  • 4.7.1.1 The signal function

[编辑] 另请参阅

为特定信号运行信号处理程序
(函数) [编辑]
C++ 文档 for signal