|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
Linux进程间通信(4)这节看看信号通信之信号发送捕捉kill()、raise()、alARM()、pause()及其基础实验, G$ J+ L5 Q8 K) [, R& d1 ^
, m# H! N1 C" _/ y- H, u. {1 Y信号概述
! n, b! ?- q4 |. u0 ?- M! d
& E! D) Q3 v' L/ h5 w$ o ● 信号是在软件层次上对中断机制的一种模拟。在原理上,一个进程收到一个信号与处理器收到一个中断请求可以说是一样的。/ Y0 y* P- M9 o6 `
# m2 y6 t9 [1 r1 d) ?5 d+ T ● 信号是异步的,一个进程不必通过任何操作来等待信号的到达,事实上进程也不知道信号到底什么时候到达。3 [5 N5 K/ a( G0 J' N! i$ s+ i
9 @6 v6 x1 z. t0 ~* l3 a; {
● 信号可以直接进行用户空间进程和内核进程之间的交互,内核进程也可以利用它来通知用户空间进程发生了哪些系统事件。它可以在任何时候发给某一个进程,而无需知道该进程的状态。如果该信号当前并未处于执行态(Running),则该信号由内核保存起来,直到该进程恢复执行再传递给它为止。如果一个信号被进程设置为阻塞,则该信号的传递被延迟,直到其阻塞被取消时才被传递给进程。
9 k$ p7 ]5 B1 M8 P8 x' @8 n* N3 n
A( d P+ E6 [ ● 信号是进程间通信机制中唯一的异步通信机制,可以看作是异步通知,通知接收信号的进程有哪些事件发生了。信号机制除了基本通知外,还可以传递附加信息。
4 J% x! q8 O! `7 b; V7 e% N1 N6 g; L" w5 x: W3 P! |0 B
信号来源
3 k$ s# _- B: R6 u# R
5 E& n+ n9 y7 @6 o" h( U$ u 信号事件发生的来源有两种:
; }- u% s8 H* k( ^8 F1 }/ \( V* e
' w. N5 f9 q5 {2 J ① 硬件来源。如我们按下了键盘上的按钮 或者出现其他硬件故障;
; Y1 A6 h; Q3 L% S q' G
6 b! ~% ^! Z- d ② 软件来源。最常用发送信号的系统函数有kill()、raise()、alarm()、setitimer()和sigqueue()等,软件来源还包括一些非法运算等操作。# Z) w: Y9 A, r, Q
% A, Z& W: s# a6 h
进程响应信号的方式! l& M3 T5 x; E J
' C$ Q6 p' N7 q2 r, N% Q ① 忽略信号。忽略信号即对信号不做处理,其中,有两个信号不能忽略:SIGKILL和SIGSTOP。9 m% b+ I C+ @/ Z+ J1 B
, g" s# ~% T+ ?7 y/ O
② 捕捉信号。定义信号处理函数,当信号发生时,执行响应的处理函数。
1 m6 W" U; J: P4 f9 m$ {( s% r. B0 ]6 X! \; v, q) a
③ 执行默认操作。Linux对每种信号都规定了默认操作,如下表所示:: j) O0 J2 g# d
/ @" m) U' Q1 k% E
) G; A# q8 y* P, N4 r: E
. ^& Z) V! m' l: |$ }$ e1 d |
|