signal

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

设置信号sig的错误处理函数。错误处理可以成令默认处理出现,忽略信号,或调用用户定义的函数。

当信号处理被设成函数,而信号出现时,是否在信号处理的开端前立即执行signal(sig, SIG_DFL)是实现定义的。而且,实现可以避免一些实现定义的信号集在信号处理运行时出现。

目录

[编辑] 参数

sig - 设置给信号处理函数的喜好。它可以是实现定义的值或下列值之一:
定义信号类型
(宏常量) [edit]


handler - 信号处理函数。必须是下列之一:
  • 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起)
  • atomic_signal_fence设为可见其副效应者(C11起)

在信号处理函数的返回时,任何信号处理修改的,非volatile sig_atomic_t及非免锁原子 (C11起)对象的值是未定义的。

signal被用于多线程程序,则行为未定义。它不要求是线程安全的。

[编辑] 注意

POSIX要求signal是线程安全的,且指定的异步信号安全(async-signal-safe)库函数列表可以为任何信号处理所调用。

abortraise后,POSIX指定killpthread_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 standard (ISO/IEC 9899:2011):
  • 7.14.1.1 The signal function (p: 266-267)
  • C99 standard (ISO/IEC 9899:1999):
  • 7.14.1.1 The signal function (p: 247-248)
  • C89/C90 standard (ISO/IEC 9899:1990):
  • 4.7.1.1 The signal function

[编辑] 参阅

运行特定信号的信号处理函数
(函数) [edit]
signalC++文档