【APUE】信号
一、信号概念
信号都被定义为正整数,不存在编号为0的信号。
信号是异步事件的经典实例。产生信号的事件对进程而言是随机出现的,进程不能简单地测试一个变量来判别是否出现了一个信号,而是必须告诉内核在此信号出现时,请执行下列操作。
信号的处理有三种方式:
1.忽略此信号。大多数信号都可使用这种方式进行处理,SIGKILL和SIGSTOP不能被忽略,它们向超级用户提供了使进程终止或停止的可靠方法。
2.捕捉信号,通知内核在某种信号发生时调用一个用户函数。注意:不能捕捉SIGKILL和SIGSTOP信号
3.执行系统默认动作,注意,针对大多数信号的系统默认动作是终止进程。
二、signal函数
#include <signal.h>
void (*signal(int signo,void (*func)(int)))(int);
返回值:若成功则返回信号以前的处理配置,若出错则返回SIG_ERR
signo参数是信号名,func的值是常量SIG_IGN、常量SIG_DFL或当接到此信号后要调用的函数的地址。SIG_IGN表示忽略此信号,SIG_DFL表示接到此信号后的动作是系统默认动作。当指定函数地址时,则在信号发生时,调用该函数。func的参数可以从shell中接收,该函数称为信号处理程序。
1.程序调用
当执行一个程序时,所有信号的状态都是系统默认或忽略,通常所有信号都被设置为它们的默认动作,除非调用exec的进程忽略该信号。确切的讲,exec函数将原先设置为要捕捉的信号都更改为它们的默认动作,其他信号的状态不变。
2.进程创建
当一个进程调用fork时,其子进程继承父进程的信号处理方式。
三、可重入函数
可重入函数是可以被中断的函数,也就是说,可以在这个函数执行的任何时刻中断它,去执行另外一段代码,返回时不会出现错误。
可重入是指一个可以被多个任务调用的过程,任务在调用时不必担心数据受否会出错。
不可重入的原因:a)使用静态数据结构;b)调用malloc或free;c)标准I/O函数