|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
Linux进程间通信(4)这节看看信号通信之信号发送捕捉kill()、raise()、alARM()、pause()及其基础实验" e3 b# k6 `. d J \, |
5 |' H8 M1 T3 L% t5 h3 D
信号概述, W( K' ]* j/ |9 a" ^: a/ U
% x5 Y. a8 t! s. F6 v3 a
● 信号是在软件层次上对中断机制的一种模拟。在原理上,一个进程收到一个信号与处理器收到一个中断请求可以说是一样的。
7 v! ?2 r' }% y
) y o1 l( P; c- ~0 `* n8 g/ u8 ~ ● 信号是异步的,一个进程不必通过任何操作来等待信号的到达,事实上进程也不知道信号到底什么时候到达。4 T5 s# k$ b p0 w z; S
5 \1 G/ z+ Q) o$ q- d0 d ● 信号可以直接进行用户空间进程和内核进程之间的交互,内核进程也可以利用它来通知用户空间进程发生了哪些系统事件。它可以在任何时候发给某一个进程,而无需知道该进程的状态。如果该信号当前并未处于执行态(Running),则该信号由内核保存起来,直到该进程恢复执行再传递给它为止。如果一个信号被进程设置为阻塞,则该信号的传递被延迟,直到其阻塞被取消时才被传递给进程。% L0 ^$ s6 m$ ]- p6 |' e" H7 T
# f7 F Y( X0 ~: {& v: u
● 信号是进程间通信机制中唯一的异步通信机制,可以看作是异步通知,通知接收信号的进程有哪些事件发生了。信号机制除了基本通知外,还可以传递附加信息。
( q' z8 }( m A- C; |
1 x" x5 ?0 m& T) e信号来源
- \4 v x: b3 `5 z6 V/ d# w- C5 s) D% {( ~: D
信号事件发生的来源有两种:
5 v( f9 i3 M F, H- N" ]8 k2 O# x0 v, O5 J- H! |/ p1 u o
① 硬件来源。如我们按下了键盘上的按钮 或者出现其他硬件故障;
* r) m$ T: c. ?9 h. b7 y# |' e6 t5 o9 v3 s+ C d
② 软件来源。最常用发送信号的系统函数有kill()、raise()、alarm()、setitimer()和sigqueue()等,软件来源还包括一些非法运算等操作。$ e1 Y; M. O; j1 |. `& Z
: v. |, a. C7 `3 y8 q# z
进程响应信号的方式6 K- S/ X9 y- ^8 i1 A% m2 q( C5 a
8 H$ q7 o- O% ?6 [: m/ b5 o
① 忽略信号。忽略信号即对信号不做处理,其中,有两个信号不能忽略:SIGKILL和SIGSTOP。" z; ?* }/ _+ f9 J
3 [! |3 u) p, _8 v Z! j3 j
② 捕捉信号。定义信号处理函数,当信号发生时,执行响应的处理函数。& O* ~) m3 c5 m- {0 y
" C: G1 j* h2 T) a2 `
③ 执行默认操作。Linux对每种信号都规定了默认操作,如下表所示:8 r1 n t P. |' Q# k2 _" B
: `! t, H: F3 f$ `1 i9 a _" c, t4 s* y/ Y2 `$ ~. J" q1 ]7 l' Q8 c' Q$ W
& w! N% b* p( ~0 ]. ^, Y9 N. U |
|