非常教程

C参考手册

编程支持 | Program support

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(在某些实现中可以禁用信号处理程序)。

信号交易

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

如果用户定义的函数在处理时返回SIGFPESIGILL或者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是线程安全的,并且指定可以从任何信号处理程序调用的异步信号安全库函数列表。

除了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):
    • 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 ++文档 |

C

C 语言是一门通用计算机编程语言,应用广泛。C 语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。