跳转到内容

C 编程/signal.h

来自维基教科书,开放的书籍,用于开放的世界

signal.h 是 C 标准库中定义的一个头文件,用于指定程序在执行期间如何处理信号。信号可以报告程序中的某些异常行为(例如除以零),或者信号可以报告程序外部的某些异步事件(例如有人在键盘上按下交互式注意键)。

信号可以通过调用 raise(向当前进程发送信号)或 kill(向任何进程发送信号)来生成。每个实现都会定义它生成(如果有)的信号以及在什么情况下生成它们。实现可以定义除这里列出的信号之外的其他信号。标准头文件 <signal.h> 可以定义以 SIG 开头的名称的附加宏,以指定附加信号的值。所有这些值都是整数常量表达式 >= 0。

除了两个信号(SIGKILL 和 SIGSTOP 不能被捕获、阻止或忽略)之外,可以为所有信号指定信号处理程序。信号处理程序是一个函数,当发生相应信号时,目标环境会调用它。目标环境会暂停程序的执行,直到信号处理程序返回或调用 longjmp。为了最大限度地移植,异步信号处理程序只应

  • 对 signal 函数进行调用(成功)
  • 为 volatile sig_atomic_t 类型的对象赋值
  • 将控制权返回给它的调用者

如果信号报告程序内的错误(并且信号不是异步的),信号处理程序可以通过调用 abortexitlongjmp 来终止。

成员函数

[编辑 | 编辑源代码]
  • int raise(int sig)。这会人为地引发信号。它会导致生成信号 sig。sig 参数与 SIG 宏兼容。如果调用成功,则返回零。否则返回一个非零值。

示例

#include <signal.h>
#include <stdio.h>
#include <stdlib.h>

static void catch_function(int signal) {
    puts("Interactive attention signal caught.");
}

int main(void) {
    if (signal(SIGINT, catch_function) == SIG_ERR) {
        fputs("An error occurred while setting a signal handler.\n", stderr);
        return EXIT_FAILURE;
    }
    puts("Raising the interactive attention signal.");
    if (raise(SIGINT) != 0) {
        fputs("Error raising the signal.\n", stderr);
        return EXIT_FAILURE;
    }
    puts("Exiting.");
    return 0;
}
  • psignal(int sig, const char *s),在 stderr 上输出信号编号的字符串表示形式。它在 4.3BSD、Solaris 和 Linux 中,但没有被 POSIX 或 Single UNIX Specification 指定。

在相同的系统上,string.h 包含非标准的 strsignal(int sig),它类似于 strerror 的工作方式。

  • void (* signal(int sig, void (*func)(int)) )(int),设置当程序接收到信号 sig 时采取的操作。如果 func 的值为 SIG_DFL,将发生该信号的默认处理。如果 func 的值为 SIG_IGN,则将忽略该信号。否则,func 指向一个信号处理程序函数,当信号发生时将调用该函数。

func 函数可以通过执行 return 语句或调用 abort、exit 或 longjmp 函数来终止。如果 func 执行 return 语句,并且 sig 的值为 SIGFPE 或任何其他与计算异常相对应的实现定义的值,则行为未定义。否则,程序将在被中断的地方恢复执行。如果函数返回并且可以满足返回请求,则 signal 函数将返回 func 的值,用于最近一次对指定信号 sig 的 signal 的调用。否则将返回 SIG_ERR 的值,并且将在 errno 中存储一个正值。

如果信号不是由于调用 abort 或 raise 函数而产生的,则行为未定义,如果信号处理程序调用标准库中的任何函数(除了 signal 函数本身(第一个参数是与导致调用处理程序的信号相对应的信号编号)之外)或引用任何具有状态存储持续时间的对象,而不是通过将值分配给 volatile sig_atomic_t 类型的静态存储持续时间变量。此外,如果对 signal 函数的此类调用导致 SIG_ERR 返回,则 errno 的值是不确定的。[1]

成员类型

[编辑 | 编辑源代码]

typedef i-type sig_atomic_t

成员宏

[编辑 | 编辑源代码]
  • SIG_DFL - 用于设置默认信号处理。
  • SIG_IGN - 用于通过忽略信号来处理信号。
  • SIG_ERR - 用于错误的数字。

成员常量

[编辑 | 编辑源代码]
常量 含义 系统
SIGHUP 挂断 POSIX
SIGINT 中断 ANSI
SIGQUIT 退出 POSIX
SIGILL 非法指令 ANSI
SIGABRT 中止 ANSI
SIGTRAP 跟踪陷阱 POSIX
SIGABRT IOT 陷阱 4.2 BSD
SIGEMT EMT 陷阱 4.2 BSD
SIGINFO 信息 4.2 BSD
SIGFPE 浮点异常 ANSI
SIGKILL 杀死,不可阻止 POSIX
SIGBUS 总线错误 4.2 BSD
SIGSEGV 段错误 ANSI
SIGSYS 系统调用参数错误 4.2 BSD
SIGPIPE 管道破裂 POSIX
SIGALRM 闹钟 POSIX
SIGTERM 终止 ANSI
SIGUSR1 用户定义的信号 1 POSIX
SIGUSR2 用户定义的信号 2 POSIX
SIGCHLD 子进程状态已更改 POSIX
SIGCLD 与 SIGCHLD 相同 System V
SIGPWR 电源故障重启 System V
SIGXCPU 超出 CPU 时间 POSIX
SIGSTOP 暂停执行 POSIX
SIGCONT 恢复执行 POSIX
[编辑 | 编辑源代码]
华夏公益教科书