|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
* K. W+ v" \: A; v$ c; H
Linux进程间通信(6)再来看看信号通信之信号集函数组及其基础实验" z/ l: n$ [" \0 f& A. S1 [
2 s* m; L6 o. ~6 P
信号集函数组
+ D7 S8 d" D& a1 p$ q6 p0 Y5 Q& ^- G2 d! F/ k
函数说明
* i, p" J; x6 @3 G% Q2 q) L' l6 Z+ B& L) s: }
: N8 h$ z& R# b0 A+ ~0 d, `+ u, L
使用信号集函数组处理信号时设计一系列的函数,这些函数按照先后的调用次序可分为以下几大模块:创建信号集、注册信号处理函数及检测信号。9 V$ J8 T" ?, p% G$ @& I
# g3 U# f4 {/ O+ l7 f# P' W' s9 R3 B
其中,创建信号集主要用于处理用户感兴趣的一些信号,其函数包括以下几个:+ U! [" X4 s8 X
) }# E$ W" X* b& a
E+ n; }5 ? i+ y o
● sigemptyset(): 将信号集初始化为空
0 R7 c2 r+ i/ g7 L9 n2 ^1 Z p7 {: [" H4 m
( F% Q: z9 i$ y, O5 \% F ● sigfillset(): 将信号集初始化为包含所有已定义的信号集
9 M: u0 M# K0 p2 \5 a- m( e5 {( A# Q1 m% R) g) K
5 h/ ?: U3 `" y/ M
● sigaddset(): 将指定信号加入到信号集中
+ V# y, w5 ]; e- _* u' ?' z1 U- R4 g
5 r' n9 m. w0 a6 _8 L- T
● sigdelset(): 将指定信号从信号集中删除
/ w8 m& @7 `: y, w0 a% F! F, o* C- V
9 `9 k# \4 P2 w& Z+ o- m; z
; |: x6 Q0 O2 }6 D7 W3 [: M; \ ● sigismember(): 查询指定信号是否在信号集中& }' c6 }& [2 t9 ?! Z2 ^
! Q \! A9 k6 a- ~* n$ R; G7 Z
2 m# C& C, I* G$ M* M 注册信号处理函数主要用于决定进程如何处理信号。这里要注意的是,信号集里的信号并不是真正可以处理的信号,只有当信号的状态处于非阻塞状态时才会真正起作用。因此,首先使用 sigprocmask() 函数检测并更改信号屏蔽字(信号屏蔽字是用来指定当前被阻塞的一组信号,它们不会被进程接收),然后使用 sigaction()函数来定义进程接收到特定信号后的行为。0 b$ s1 e2 v4 t8 S6 B& q
6 q( a+ T( O, S! N
; ^; w; i$ X6 s. r+ _8 S 检测信号是信号处理的后续步骤,因为被阻塞的信号不会传递给进程,所以这些信号就处于“未处理”状态(也就是进程不清除它的存在)。sigaction()函数允许进程检测“未处理”信号,并进一步决定对它们做何处理。
: @9 Q" r1 ?0 a+ s
; t/ `( F6 C; K( \
9 t) T9 ]3 F9 E+ Y, k函数格式
! V1 y3 j; Q) O, d! e5 Q, f% n) ^% i7 h6 d* X9 M" s& J9 b
' o5 M- V" y2 Z# u$ w1 i
. p8 ?1 x% m& R: F0 w- h, \
* F: h# h% _3 |$ L* M+ `, ^$ g
* `5 k$ \. `5 U6 I1 o! I' J& i. f4 Q$ _# f, P! ?, x
|
|