函数
<csignal>

signal

void (*signal(int sig, void (*func)(int)))(int);
设置处理信号的函数
sig 指定的信号编号指定处理信号的方式。

参数 func 指定了程序处理信号的三种方式之一
  • 默认处理 (SIG_DFL):信号由该特定信号的默认操作处理。
  • 忽略信号 (SIG_IGN):信号被忽略,即使代码执行没有意义,也会继续执行。
  • 函数处理器:定义了一个特定的函数来处理信号。

在程序启动时,SIG_DFLSIG_IGN 被设置为每个支持的信号的默认信号处理行为。

参数

sig
要设置处理函数的信号值。以下宏常量表达式标识了标准信号值

signal
SIGABRT(Signal Abort) 异常终止,例如由 abort 函数发起的终止。
SIGFPE(Signal Floating-Point Exception) 错误的算术运算,例如除以零或导致溢出的运算(不一定与浮点运算有关)。
SIGILL(Signal Illegal Instruction) 无效的函数映像,例如非法指令。这通常是由于代码损坏或尝试执行数据所致。
SIGINT(Signal Interrupt) 交互式注意信号。通常由应用程序用户生成。
SIGSEGV(信号分段违例) 无效的存储访问:当程序尝试读取或写入其已分配内存之外的区域时。
SIGTERM(Signal Terminate) 发送给程序的终止请求。

每个库实现都可以提供额外的信号值宏常量,这些常量可以与此函数一起使用。

请注意,并非所有运行环境都被要求自动生成信号,即使是在上述特定情况下,尽管所有运行环境都必须传递由显式调用 raise 函数生成的信号。
func
函数指针。它可以是程序员定义的函数,也可以是以下预定义函数之一

SIG_DFL默认处理:信号由该特定信号的默认操作处理。
SIG_IGN忽略信号:信号被忽略。

如果是一个函数,它应该遵循以下原型(带有 C 链接)
1
void handler_function (int parameter);

返回值

返回类型与参数 func 的类型相同。

如果请求成功,函数将返回一个指向在调用之前负责处理该信号的特定处理函数的指针,如果有的话。或者,如果调用前信号被默认处理程序处理或被忽略,则返回 SIG_DFLSIG_IGN

如果函数在注册新的信号处理程序方面不成功,它将返回 SIG_ERR,并且 errno 可能被设置为正值。

示例

/* signal example */
#include <stdio.h>      /* printf */
#include <signal.h>     /* signal, raise, sig_atomic_t */

sig_atomic_t signaled = 0;

void my_handler (int param)
{
  signaled = 1;
}

int main ()
{
  void (*prev_handler)(int);

  prev_handler = signal (SIGINT, my_handler);

  /* ... */
  raise(SIGINT);
  /* ... */
  
  printf ("signaled is %d.\n",signaled);
  

  return 0;
}
signaled is 1.

数据竞争

未定义:在多线程程序中调用此函数会导致未定义的行为

异常 (C++)

无异常保证:此函数从不抛出异常。

另见