信号处理 - signal

优质
小牛编辑
130浏览
2023-12-01

对一个信号指定新动作或回到其原先的动作

函数原型

  1. #include <signal.h>
  2. typedef void (*sighandler_t)(int);
  3. sighandler_t signal(int signum, sighandler_t handler);

参数

signum即信号值。后面的handler就是处理这个信号的动作。它的值为:

  • SIG_DFL:默认动作
  • SIG_IGN:忽略该信号(SIGKILL和SIGSTOP无法忽略,因为要保证root的绝对控制权)
  • 信号句柄

信号句柄

信号句柄即捕获函数(这里是函数指针类型),该函数必须是只有一个整型参数,且返回值为void。

信号发送时,如果建立了信号句柄,系统在把控制转移到信号句柄之前有两种做法:

  • 将阻塞后继新的信号直至信号句柄完成为止
  • 或这首先改变该信号的动作为SIG_DEL(相当于调用signal(signum,SIG_DEL),在执行完一次信号句柄之后,将其恢复为默认动作)

BSD系统使用前者,系统V使用后一种。Linux默认采用BSD的做法,但当设置了特征测试宏_XOPEN_SOURCE时,则采用系统V的做法,此时编译时要这样编译

  1. gcc test.c -D_XOPEN_SOURCE

返回值

返回值是指向信号signum前一次有效动作的指针。它和函数第二个参数类型相同。返回值是:

  • SIG_DFL
  • SIG_IGN
  • 信号句柄指针

可以保存这个值,并且在以后用它作为函数第二个参数再次调用signal(),从而恢复信号原来的动作

如果出错,返回SIG_ERR并设置errno。唯一地错误码(errno)是EINVAL

相关函数

[[sigaction|sigaction]]