UNIX系统中C语言的信号处理
1. 背景知识
在UNIX系统中,当一个进程在后台启动时,标准命令解释器(如Bourne和C shell)会发出调用以忽略键盘生成的信号。这是为了避免按下中断键时,不仅终止预期的进程,还终止后台进程。因为键盘生成的信号通常会发送到从终端启动的所有进程。
2. 信号捕获
可以通过在signal调用中提供指向用户例程的指针来捕获和处理信号。当第一次接收到信号时,该例程将被调用以处理该信号。信号处理程序被调用时,会传递一个整数参数,指示接收到的是哪个信号。这个整数可以与signal.h中的常量进行比较,从而使程序员能够编写通用的信号处理程序。
以下是捕获中断信号并打印 “OUCH” 的示例代码:
#include <signal.h> main() { extern int handler(); signal(SIGINT, handler); for (;;) pause(); } handler() { printf("OUCH\n"); }在非Berkeley系统中,如果第二次按下中断键,程序将退出,因为信号没有被重置。
为了每次按下中断键都打印 “OUCH”,可以添加一行代码来重置信号:
#include <signal.h> main() { extern int ha