信号机制是进程之间相互传递消息的一种方法,信号全称为软中断信号,也有人称软中断。从它的命名可以看出,它的实质和使用很像中断,所有,信号可以说是进程控制的一部分。
信号signal处理是Linux程序的一个特色,用信号处理来模拟操作系统的中断功能。
头文件
#include <signal.h>
#include<csignal>
或 #include <signal.h>
是处理信号的C-library。该库包含 signal
与 raise
两个功能函数。
- 函数 signal 用于捕获信号,可指定信号处理的方式。
- 函数 raise产生一个信号,并向当前正在执行的程序发送该信号
一、signal()函数
函数signal 用于捕获信号,可指定信号处理的方式,函数声明如下:
void (*signal(int sig, void (*func)(int)))(int);
第一个参数 sig 指明了所要处理的信号类型,它可以取除了SIGKILL和SIGSTOP外的任何一种信号。
第二个参数描述了与信号关联的动作,下面将会对这三个参数进行讲解。
- 当程序收到信号的进程对各种信号有不同的处理方法。处理方法可以分为三类:
I. 默认处理:对信号进行该信号的系统默认处理,第二参数为SIG_DFL
。
II. 忽略信号:忽略该信号,第二参数为SIG_IGN
。
III. Function handler:指定处理函数,由该函数来处理,第二参数为函数指针
- 若signal函数中第二参数(函数指针)中通过
raise
发出与signal函数对应信号类型相同的信号。程序将在signal函数这成为死循环,自己发信号,自己捕获,进程暂停。
例如:
signal(SIGINT, signalHandler); 代表当程序检测到SIGINT信号的时候,执行signalHandler函数。SIGINT信号是程序终止(interrupt)信号,故当你按ctrl+c时,就相当于释放了程序终止(interrupt)信号,就会自动调用signalHandler函数。
二、raise()函数
函数raise
产生一个信号sig
,并向当前正在执行的程序发送信号sig
,其声明如下:
int raise (int sig);
重点: 值得注意的是,raise发出的信号,可被当前进程中同类型型号的signal函数捕获。
其他信号
系统的信号我们可以在终端键入kill -l
查看(共64个)。其实这些信号时系统定义的宏。
一些常用的Signal 如下:
Signal Description
SIGALRM 用alarm函数设置的timer超时或setitimer函数设置的interval timer超时
SIGBUS 某种特定的硬件异常,通常由内存访问引起
SIGCANCEL 由Solaris Thread Library内部使用,通常不会使用
SIGCHLD 进程Terminate或Stop的时候,SIGCHLD会发送给它的父进程。缺省情况下该Signal会被忽略
SIGCONT 当被stop的进程恢复运行的时候,自动发送
SIGEMT 和实现相关的硬件异常
SIGFPE 数学相关的异常,如被0除,浮点溢出,等等
SIGFREEZE Solaris专用,Hiberate或者Suspended时候发送
SIGHUP 发送给具有Terminal的Controlling Process,当terminal 被disconnect时候发送
SIGILL 非法指令异常
SIGINFO BSD signal。由Status Key产生,通常是CTRL+T。发送给所有Foreground Group的进程
SIGINT 由Interrupt Key产生,通常是CTRL+C或者DELETE。发送给所有ForeGround Group的进程
SIGIO 异步IO事件
SIGIOT 实现相关的硬件异常,一般对应SIGABRT
SIGKILL 无法处理和忽略。中止某个进程
SIGLWP 由Solaris Thread Libray内部使用
SIGPIPE 在reader中止之后写Pipe的时候发送
SIGPOLL 当某个事件发送给Pollable Device的时候发送
SIGPROF Setitimer指定的Profiling Interval Timer所产生
SIGPWR 和系统相关。和UPS相关。
SIGQUIT 输入Quit Key的时候(CTRL+\)发送给所有Foreground Group的进程
SIGSEGV 非法内存访问
SIGSTKFLT Linux专用,数学协处理器的栈异常
SIGSTOP 中止进程。无法处理和忽略。
SIGSYS 非法系统调用
SIGTERM 请求中止进程,kill命令缺省发送
SIGTHAW Solaris专用,从Suspend恢复时候发送
SIGTRAP 实现相关的硬件异常。一般是调试异常
SIGTSTP Suspend Key,一般是Ctrl+Z。发送给所有Foreground Group的进程
SIGTTIN 当Background Group的进程尝试读取Terminal的时候发送
SIGTTOU 当Background Group的进程尝试写Terminal的时候发送
SIGURG 当out-of-band data接收的时候可能发送
SIGUSR1 用户自定义signal 1
SIGUSR2 用户自定义signal 2
SIGVTALRM setitimer函数设置的Virtual Interval Timer超时的时候
SIGWAITING Solaris Thread Library内部实现专用
SIGWINCH 当Terminal的窗口大小改变的时候,发送给Foreground Group的所有进程
SIGXCPU 当CPU时间限制超时的时候
SIGXFSZ 进程超过文件大小限制
SIGXRES Solaris专用,进程超过资源限制的时候发