跳转到内容

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

参考文献

[编辑 | 编辑源代码]
[编辑 | 编辑源代码]
华夏公益教科书