|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
Linux进程间通信(4)这节看看信号通信之信号发送捕捉kill()、raise()、alARM()、pause()及其基础实验
6 |" ]3 ?' E/ \$ k1 _2 M2 p( |; {2 w$ I/ _) S! v
信号概述7 t1 j+ D8 C7 w/ Z8 a- v
$ B. P. O, S3 @9 ` ● 信号是在软件层次上对中断机制的一种模拟。在原理上,一个进程收到一个信号与处理器收到一个中断请求可以说是一样的。
6 ?0 I5 v& o! p' ?9 \2 B3 f
9 i) y0 [* v+ j. k ● 信号是异步的,一个进程不必通过任何操作来等待信号的到达,事实上进程也不知道信号到底什么时候到达。
4 e5 T0 Z& a4 N6 s1 }% M+ k) c: k( f" z" [; p- I+ E
● 信号可以直接进行用户空间进程和内核进程之间的交互,内核进程也可以利用它来通知用户空间进程发生了哪些系统事件。它可以在任何时候发给某一个进程,而无需知道该进程的状态。如果该信号当前并未处于执行态(Running),则该信号由内核保存起来,直到该进程恢复执行再传递给它为止。如果一个信号被进程设置为阻塞,则该信号的传递被延迟,直到其阻塞被取消时才被传递给进程。
5 L4 Z% T2 k/ B2 _; `- i/ e
9 |0 u$ K/ e' r0 c ● 信号是进程间通信机制中唯一的异步通信机制,可以看作是异步通知,通知接收信号的进程有哪些事件发生了。信号机制除了基本通知外,还可以传递附加信息。5 M3 ]% Y) @ o. w1 X9 H7 S
) o7 ]( D4 l/ N1 r& |信号来源
& d: l3 g+ u6 W; j- R4 p8 \: v
; K9 i. t+ c1 Q1 N3 T5 z9 A 信号事件发生的来源有两种:
0 u- e' c* I, t
# B( O- B' R' t! J/ f ① 硬件来源。如我们按下了键盘上的按钮 或者出现其他硬件故障;
! O+ l* N) O. ?! Y9 M# l f: O; j
② 软件来源。最常用发送信号的系统函数有kill()、raise()、alarm()、setitimer()和sigqueue()等,软件来源还包括一些非法运算等操作。
! ^' S1 u' @* H* T7 H( ?7 V) i- Q/ c, V
进程响应信号的方式
$ O q" W8 K) \6 y& ^, W/ O! c
6 [8 S3 ^) o5 U ① 忽略信号。忽略信号即对信号不做处理,其中,有两个信号不能忽略:SIGKILL和SIGSTOP。
; e- B; o8 \- C( ` V
' I; c6 w2 D& C$ f/ `6 c ② 捕捉信号。定义信号处理函数,当信号发生时,执行响应的处理函数。7 o8 k) X1 _- k$ e9 g- x6 w
. d& d! C ?8 Q' U4 F9 R ③ 执行默认操作。Linux对每种信号都规定了默认操作,如下表所示:" o+ k$ `+ K4 Q0 X3 {) \! _/ g
% z* y$ T( u2 w( I
" K n, ~# b8 L f( V
* B: U$ y( M* [- G |
|