|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
Linux进程间通信(4)这节看看信号通信之信号发送捕捉kill()、raise()、alARM()、pause()及其基础实验3 R: C, o' Z. ?$ |) @" ~4 U1 |4 g' H
1 Z y7 }: L3 P; m6 X9 A' n! ]* o信号概述
2 \, @% [+ x* M0 O7 m& h+ t% p+ L% q- g4 `' h
● 信号是在软件层次上对中断机制的一种模拟。在原理上,一个进程收到一个信号与处理器收到一个中断请求可以说是一样的。7 I/ c2 g3 t% X9 h# ~+ d
* e# D/ ?) a1 U2 y! r: L3 d, T, r
● 信号是异步的,一个进程不必通过任何操作来等待信号的到达,事实上进程也不知道信号到底什么时候到达。
: z* a7 s& W/ j4 ^4 w# o& u2 h
- S# R! w, d3 _+ R0 B: h ● 信号可以直接进行用户空间进程和内核进程之间的交互,内核进程也可以利用它来通知用户空间进程发生了哪些系统事件。它可以在任何时候发给某一个进程,而无需知道该进程的状态。如果该信号当前并未处于执行态(Running),则该信号由内核保存起来,直到该进程恢复执行再传递给它为止。如果一个信号被进程设置为阻塞,则该信号的传递被延迟,直到其阻塞被取消时才被传递给进程。- u* I- W1 K8 A+ k- u7 @! V
% o3 h5 W9 y( E3 ~, R Y ● 信号是进程间通信机制中唯一的异步通信机制,可以看作是异步通知,通知接收信号的进程有哪些事件发生了。信号机制除了基本通知外,还可以传递附加信息。
1 E0 F" N: ]7 v+ [, S
* N6 F- B9 z9 C% ?% e信号来源
) r7 @0 x+ w! A! u6 c" Z% { n G$ `6 S- `
信号事件发生的来源有两种:
. H8 s% ^8 X! p+ z1 K+ m5 _& t5 j& ]+ I S$ e* j
① 硬件来源。如我们按下了键盘上的按钮 或者出现其他硬件故障;' P& Y: W3 ?% K
3 ^' F3 K# z" T& [! G ② 软件来源。最常用发送信号的系统函数有kill()、raise()、alarm()、setitimer()和sigqueue()等,软件来源还包括一些非法运算等操作。* [1 d, U% B ]1 @% N+ o! f
/ x m% C* G+ s: j/ o
进程响应信号的方式
5 c; x* \! ^' W3 w. @( `
9 y) N6 P6 C8 ]$ d( ? ① 忽略信号。忽略信号即对信号不做处理,其中,有两个信号不能忽略:SIGKILL和SIGSTOP。
1 o5 d3 Y5 K# |0 V' _
. n6 }) y; f) p ② 捕捉信号。定义信号处理函数,当信号发生时,执行响应的处理函数。
R5 `- c. [; i: g$ @5 x( m$ Q
7 o) c) K& r( T2 v O0 {* L3 s& I ③ 执行默认操作。Linux对每种信号都规定了默认操作,如下表所示:0 _% [1 I0 b* T% W7 C
0 v3 Y) `! s+ g4 z* j' z' v, }
# k u6 C8 ?/ q* x8 M
' u! ~0 L' O% v4 c/ o& h; v
|
|