一 信号概述:
(1)信号是软件中断,提供一种了一种处理异步事件的方法。
*当引发信号的事件发生时,为进程产生一个信号(或向进程发生一个信号)。事件可以是硬件异常(除以0)、软件条件(如:alarm计时器超时)、终端产生的信号或kill函数产生的。
*每个信号都有一个名字,这些名字都以SIG开头。在头文件<signal.h>中,这些文件被定义为正整数(信号编号),不存在编号为0的信号。
(2)可靠信号与不可靠信号:
*不可靠信号:信号会丢失;不排队,多次发送同一个信号只收到一次;每次对信号进行处理后,信号动作复位为默认值,需再次调用signal。
*可靠信心:信号不会丢失;会对信号排队;调用sigaction对给定信号设置了一个动作,那么在调用sigaction显式改变之前,该设置一直有效。
(3)信号的处理:
1.忽略此信号。大多数信号都可使用这种方式进行处理,但是两种信号缺不能被忽略(SIGKILL和SIGSTOP)。
2.捕捉信号。要通知内核在信号发生时调用一个用户函数,在用户函数中,可执行用户希望对这种事情进行处理。(SIGKILL和SIGSTOP例外,不能被捕捉)
3.执行系统默认动作。大多数信号的系统默认动作是终止进程。
(4)kill:
man kill:查看kill。
kill -l:显示系统支持的信号。
kill -signal pid:向进程号发送信号。
pkill -signal name:signal processes based on name and other attributes.
(5)signal函数:(部分系统singal提供不可靠信号,部分提供可靠信号语义么,所以最好用sigaction函数代替sigal)。
1.格式:
*sighandler_t signal(int signum,sighandler_t handler);
2.参数说明:
*signum是信号名。
*handler的值是常量SIG_IGN、常量SIG_DEL或当接到此信号后要调用的函数地址。
*SIG_IGN:表示内核忽略此信号。(SIGKILL和SIGSTOP不能忽略和捕捉)
*SIG_DEL:表示接到此信号后的动作是系统默认的动作。
*当指定函数指针时,则信号发生时,调用该函数。此函数称为信号处理程序或信号捕捉函数。
(6)sigaction函数:提供可靠信号,建议使用它代替signal函数。
二 信号与进程:
(一)信号屏蔽字:
(1)概述:
*每个进程都有一个信号屏蔽字(signal mask):它规定了当前要阻塞递送到该进程的信号集。
*信号未决(pending):在信号产生和信号传递之间的时间间隔内称信号是未决的。
*如果为进程产生一个选择为阻塞的信号,而且对该信号的动作是系统默认动作或捕捉信号,则为该进程将此信号保持为未决状态,直到:该进程对此信号解除了阻塞;或对此信号的动作更改为忽略。
(2)函数:
*sigprocmask:检测或更改其信号屏蔽字。仅为单线程的进程定义的,不适合多线程进程。
(二)信号集:表示多个信号的集合,数据类型:sigset_t。
(1)信号集操作函数: