|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
3 J1 S2 F" A/ a7 x
Linux进程间通信(6)再来看看信号通信之信号集函数组及其基础实验+ v5 T; d/ O# t1 t. `: ~7 G
% b7 j8 P: b. B8 n( | V0 I) c5 b信号集函数组
1 L9 s$ p2 n7 j
% y; |* T; Q- Y+ I( d9 C7 q函数说明
+ B* G; a6 C. x8 L. r4 D
3 T& X2 p! l& @8 F P. o6 r1 d( e
3 P. r8 s; @" p% X 使用信号集函数组处理信号时设计一系列的函数,这些函数按照先后的调用次序可分为以下几大模块:创建信号集、注册信号处理函数及检测信号。
9 m! q/ @) S1 L
" I9 \- }+ Q& a! M, H& m' H; |4 n# H! z% Y) [7 \
其中,创建信号集主要用于处理用户感兴趣的一些信号,其函数包括以下几个:
6 D/ N, G% N5 }' m7 Z4 n8 t) G4 W! Q8 \7 h5 n, b
& R k/ K7 C; h5 X+ j) C; X
● sigemptyset(): 将信号集初始化为空+ V) c& ?7 t1 U+ f
[: p, P8 M: m- @' I) a
: ^* @2 c! W. c) V
● sigfillset(): 将信号集初始化为包含所有已定义的信号集2 h6 L% }8 w k$ ~* M
$ o+ @( S! S& `
; s! V9 x6 h9 B3 _7 |. z ● sigaddset(): 将指定信号加入到信号集中
- L6 h6 Q" @$ k& z6 E9 y3 n# F; q$ [, p/ m t# d, I
& a4 i# E5 X* @8 f ● sigdelset(): 将指定信号从信号集中删除( i+ m. ^" a: P4 Z* K! f2 w( Z4 d- t6 K
# Z, Q7 Y+ @0 L5 t
# A/ K1 t2 k) x8 N7 `
● sigismember(): 查询指定信号是否在信号集中
+ y5 \ @4 i. t; [* g3 Z+ v. [+ }# o+ `4 c
, M0 f* l S6 z; I- f. {0 {
注册信号处理函数主要用于决定进程如何处理信号。这里要注意的是,信号集里的信号并不是真正可以处理的信号,只有当信号的状态处于非阻塞状态时才会真正起作用。因此,首先使用 sigprocmask() 函数检测并更改信号屏蔽字(信号屏蔽字是用来指定当前被阻塞的一组信号,它们不会被进程接收),然后使用 sigaction()函数来定义进程接收到特定信号后的行为。/ O; o+ W ~* R" h H9 S+ u
/ q2 f% X/ E7 f6 a. l) H% x" q, l) G0 ~
检测信号是信号处理的后续步骤,因为被阻塞的信号不会传递给进程,所以这些信号就处于“未处理”状态(也就是进程不清除它的存在)。sigaction()函数允许进程检测“未处理”信号,并进一步决定对它们做何处理。
) X0 X5 d, j @7 |# @1 X
2 {, w; _- y& S5 V t# _
/ j; _: F# t9 k$ a: P1 d4 ]. q% ^函数格式# g7 e/ z" I9 V0 c$ @5 k+ J) J
4 w# m* o* z0 h/ e% I S% [7 W: `8 ]/ J5 w
' C3 l: k8 u/ H: D/ y" c6 P- o* Q ?" }* y
, @# ~* Q6 B) M' {# Y9 |6 I
8 e7 W, S* e' |* L8 {9 O$ ?) V |
|