signal

signal

在头文件中定义
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宏。信号处理程序设置为默认信号处理程序。

void fun(int sig

返回值

成功则返回先前的信号处理程序,或失败时返回SIG_ERR(在某些实现中可以禁用信号处理程序)。

信号交易

作为信号处理程序安装的用户定义函数受到以下限制。

如果用户定义的函数在处理时返回SIGFPESIGILL或者SIGSEGV则行为未定义。

如果信号处理程序由于中止或提升而被调用,那么如果信号处理程序调用提升,则行为不确定。

如果信号处理程序由于中止或提升而被调用(换句话说,信号处理程序是异步的),则行为是不确定的。

  • 信号处理程序调用标准库中的任何函数,以下情况除外

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

  • 类型的对象 volatile sig_atomic_t

从信号处理程序返回时,由信号处理程序修改的非易失性sig_atomic_t或无锁定原子(从C11开始)的任何对象的值都未定义。

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

注意

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

除了abortraise外,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):

扩展内容

raiseruns the signal handler for particular signal (function)

| signal的C ++文档 |