首页 > 代码库 > 【APUE】信号

【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函数