展望2011

《unix环境高级编程》通读学习笔记(二)(第10章)

上一篇 / 下一篇  2007-07-25 23:06:25 / 个人分类:unix环境高级编程的学习记录

51Testing软件测试网[J3s$Mg|%k g

 51Testing软件测试网p8bd!} VJ+K5e d

d~R9S:m qb0第10章 信号51Testing软件测试网 t#fz!kb;_

w0v]3eR.~O+X0}051Testing软件测试网0TRk;iC6M

10.1 引言
f(e^Py D4YF,z0
信号是软件中断。它提供了一种处理异步事件的方法。

/z*|*k1n~Ur!Z^ B*H1^051Testing软件测试网4OJ:D&QsL'X

10.2 信号的概念51Testing软件测试网2nsY"T;kG
字符SIG开头 头文件<signal.h>中51Testing软件测试网rzTO O,h{4[6B
产生一个信号的条件:51Testing软件测试网)yX8U jnp!a}%WAY
1.用户按某些终端键
.{8h$~9Xkh02.硬件异常产生信号51Testing软件测试网/j$p&] s+o8\@&`9r)_
3.进程用kill(2)函数可将信号发送给令一个进程或进程组
5wd'?BK04.用户可用kill(1)命令将信号发送给其他进程
(j0KvB,d7x6q-b05.当检测到某种软件条件已经发生,并将其通知有关进程时也产生信号

Qe4a&ISn_ L y051Testing软件测试网6{-m g@"bO \

信号出现时的三种操作方式:
O8r)R(ci8w)V{m:]01.忽略此信号51Testing软件测试网t0o9t@,F
2.捕捉信号
$R0T0hj6Y03.执行系统默认动作51Testing软件测试网 v*h)gT6h'{

b!W4F^L.j3{0表10-1 UNIX信号

a&Rj| YW&a051Testing软件测试网8D0f;c#USwi

10.3 signal函数
5Y,g l(i x8d4wj,D A} }0signal函数为信号处理程序(signal handler)或信号捕捉函数(signal-catching function)
+?&k,[vJ(OUQ `0————————————————————————————————————————————————————51Testing软件测试网9j:d7v#^xt5M
#include <signal.h>51Testing软件测试网bs H(Xy2rb2Tr
void (*signal(int signo,void (*func)(int)))(int);
$PEj4E8c1m F0                                             返回:成功则为以前的信号处理配置,若出错则为SIG_ERR
1E@%cX|0f8S:g0————————————————————————————————————————————————————

S$^$Ih^\4V0

^I:I'Pi010.4 不可靠的信号
L$Vw*Qs-CUL@9`010.5 中断的系统调用
51Testing软件测试网6G0W&G(}E
系统调用分为两类:低速系统调用和其他系统调用。低速系统调用是可能会使进程永远阻塞的一类系统调用。51Testing软件测试网v7Or4@)X4s9ql0m

R%s!BYU6iA IY0表10-2 几种信号实现所提供的功能

:L*W2b@3DvIGc051Testing软件测试网K vmd7t#}|*I*E

10.6 可再入函数51Testing软件测试网3WJF9D6G
进程捕捉到信号并继续执行时,首先执行该信号处理程序中的指令。如果从信号处理程序返回,则继续执行在捕捉到信号时进程正在执行的正常指令序列。
~5J+I(I(X {2SXA'S0如果进程正在执行某函数,由于捕捉到信号插入执行信号处理程序,其中又调用该函数,则可能会出错。所以引入了可再入函数的概念。

_#xnn!bu-G051Testing软件测试网(c OY5s$E`

表10-3 信号处理程序中可以调用的可再入函数

Yz3P0h7d)N7^e M051Testing软件测试网.X?&xG![KJ:X9h

10.7 SIGCLD语义
}/{,Kd7j0
SIGCLD是系统V的一个信号名,它不同于其他信号。如果用signal或sigset设置信号配置,则SVR4存在兼容性限制。所以务必了解你所用的系统中SIGCHLD信号的语义。

l%dxS$I[)csr051Testing软件测试网nw]VI-@*}c

10.8 可靠信号术语和语义51Testing软件测试网6rSr#GUL-\,D
当造成信号的事件发生时,为进程产生一个信号,内核在进程表中设置一个标志,这个动作称之为向一个进程递送了一个信号。在信号产生(generation)和递送(delivery)之间的时间间隔内,称信号未决(pending)。51Testing软件测试网~mD#qDq
当递送一个原来北阻塞的信号给进程时,而不是在产生该信号时,内核才决定对它的处理方式。于是进程在信号递送给它之前仍可改变对它的动作。51Testing软件测试网l3Z-L"[4[%M}6ZEx

t&I e q0F010.9 kill 和raise函数51Testing软件测试网z0fL"jh1O#P'[A
kill函数将信号发送给进程或进程组。raise函数则允许进程向自身发送信号。51Testing软件测试网\V,?/J5T7d%PY{d
———————————————————————————————————————————————————51Testing软件测试网9|7WFNsC:Sa"FE
#include <sys/ttpes.h>51Testing软件测试网/k9n0e-g] fpnHH
#include <signal.h>

m/A![+a"?D0

3S$j,W;}B2Z%M0int kill(pid_t pid,int signo);51Testing软件测试网$B z!K8g;nV@]i6P
int raise(int signo);51Testing软件测试网`H:H/A$l
                                  两个函数返回:若成功则为0,若出错则为-151Testing软件测试网8x)|;F} Ru$@X
———————————————————————————————————————————————————
9OFUe r0进程将信号发送给其他进程需要许可权。

T2H1?G8nJ051Testing软件测试网j|8s,a C

10.10 alarm和 pause函数51Testing软件测试网0]9gO9J9`3? v7w
alarm函数可以设置一个时间值(闹钟时间),当所设置的时间值被超过后,产生SIGALRM信号。
{2?/i3f&u9m1s:q0————————————————————————————————————————————————————51Testing软件测试网Pw&^.D b%|/P {9R
#include <unistd.h>

9r#x+u;kkb7wo1A(} ^m051Testing软件测试网v+R2[;gt8{

unsigned int alarm(unsigned int seconds);51Testing软件测试网1B&l h w#L3x6dM
                                     返回:0或以前设置的闹钟实践的余留秒数51Testing软件测试网6[Hg#W(`%f{q
————————————————————————————————————————————————————
)l x8w f#z_9s t"DG0每个进程只能有一个闹钟时间。大多数是使用闹钟的进程捕捉此信号。51Testing软件测试网S3Je#Z)]J'zm2}|&c e
pause函数使调用进程挂起直至捕捉到一个信号。
A2OsP1j*tD wGz%Fk0————————————————————————————————————————————————————51Testing软件测试网7g:`Os&b ? q
#include <unistd.h>51Testing软件测试网xa'[~"g
int pause(void);51Testing软件测试网0T0X;g xG
                                    返回:-1,errno设置为EINTR
` L[ rU a;~W%_0————————————————————————————————————————————————————
)[zi.?0it^0只有执行了一个信号处理程序并从其返回时,pause才返回。51Testing软件测试网}3MY@ZqC8~W

51Testing软件测试网]z9Y.m3n

10.11 信号集51Testing软件测试网ZLa0n5Z,\?i9j
能表示多个信号-信号集(signal set)的数据类型。
:M6jdE0yr0数据类型sigset_t包含一个信号集。五个处理信号集的函数:51Testing软件测试网Eg k:Fc cDu
————————————————————————————————————————————————————51Testing软件测试网-i})r7tTt(h
#include <signal.h>
.Z e%m8yo W NHE0int sigemptyset(sigset_t *set);51Testing软件测试网st_&uHRJ
int sigfillset(sigset_t *set);51Testing软件测试网}H g"n6@*S
int sigaddset(sigset_t *set,int signo);
[/ay#K(]iQ0int sigdelset(sigset_t *set,int signo);
QtUC M+A0                                            四个函数返回:若成功则为0,若出错则为-1
B`zC%VHJjM0int sigismember(const sigset_t *set,int signo);
7G#DO%q,B)TM0w _0                                            返回:若真则为1,若假则为0
z3f:o({2E/`*^!nba p0————————————————————————————————————————————————————51Testing软件测试网F"\^5K~ l)oh2[h
函数sigemptyset初始化由set指向的信号集,使排除其中所有信号。
f#o~OV:a0函数sigfillset初始化由set指向的信号集,使其包括所有信号。
D'A;Lz @#P0所有应用程序在使用信号集前,要对该信号集调用sigemptyset或sigfillset一次。51Testing软件测试网;sb$E p;J?`
函数sigaddset将一个信号添加到现存集中,sigdelset则从信号集中删除一个信号。对所有以信号集作为参数的函数,都向其传送信号集地址。

-``&{Dl7r!N0

,H,`9Uj1@'C^010.12 sigprocmask 函数51Testing软件测试网4YW{ V;Z,e3`
一个进程的信号屏蔽字规定了当前阻塞而不能递送给该进程的信号集。调用函数sigprocmask可以检测或更改(或两者)进程的信号屏蔽字。51Testing软件测试网3g |F U[ gr"S
————————————————————————————————————————51Testing软件测试网7i l^3Y e|s/rc'J
# include <signal.h>51Testing软件测试网Xjq:zu7t
int sigprocmask(int h o w, const sigset_t *s e t, sigset_t *o s e t) ;
!?!f x U-I*ObE0返回:若成功则为0,若出错则为-1
a)E``@|*E0————————————————————————————————————————51Testing软件测试网0aY+N!Zc

51Testing软件测试网.w$F5\8F0?5m8@H

10.13 sigpending函数
h Z a*MOr0G0
sigpending返回对于调用进程被阻塞不能递送和当前未决的信号集。该信号集通过set参数返回。
;{:X$Z E CP/R1~0——————————————————————————————————————————51Testing软件测试网9A(`+M0v6Tb
#include <signal.h>51Testing软件测试网x!W`*T:}] ^@~%^
int sigpending(sigset_t *s e t) ;51Testing软件测试网$i5] W;UPD0qy
返回:若成功则为0,若出错则为-1
:m;lY}*AoSz1QFr0——————————————————————————————————————————51Testing软件测试网 X*Ceb^q

51Testing软件测试网s\ Y-G6Q

10.14 sigaction函数
yI3t M:|&es0sigaction函数的功能是检查或修改(或两者)与指定信号相关联的处理动作。此函数取代了UNIX早期版本使用的signal函数。
'x`8Sa/{e_`0————————————————————————————————————51Testing软件测试网$} jU&lS(z(A%Ru9z
#include <signal.h>
B5waFod5i-W2dH(P'S0int sigaction(int signo, const struct sigaction *a c t,51Testing软件测试网jds0\,X^]
struct sigaction *oact) ;51Testing软件测试网2e!JV bDX)|,`P7k
返回:若成功则为0,若出错则为- 151Testing软件测试网I.q,U$N_B;rV
————————————————————————————————————51Testing软件测试网:f"Z'G9qJ @@
struct sigaction {
@B;Z%Gx9Lx zx*vL0void        (*sa_handler)(); /* addr of signal handler,51Testing软件测试网2n,k#?:P#p;D D*~8T$_'sb?
or SIG_IGN, or SIG_DFL */51Testing软件测试网7]Wc6X3d
sigset_t sa_mask;            /* additional signals to block */
,c%mR1zz xUe'K'J0int         sa_flags;        /* signal options, Table 10-5 */
6YU+A+rJ5g Yx:A0} ;51Testing软件测试网%F:^;NHSPTLq.EG
表10-5   信号处理的选择项标志( sa_flags)

$W AdT7y.Q051Testing软件测试网 C6z"Il(l(`

10.15 sigsetjmp 和siglongjmp函数51Testing软件测试网Uzhv,rux9|
在信号处理程序中经常调用longjmp函数以返回到程序的主循环中,而不是从该处理程序返回。51Testing软件测试网f+?9H+^7D&lf
POSIX.1定义了两个新函数sigsetjmp和siglongjmp。在信号处理程序中作非局部转移时应当使用这两个函数。
/H)k\#Y e U0——————————————————————————————————51Testing软件测试网w1I? Xh O ro\\T%A
#include <setjmp.h>
1^6c)TU;h0m6d ed(Q0int sigsetjmp(sigjmp_buf env, int savemask) ;51Testing软件测试网4wj1JC P*Daw
返回:若直接调用则为0,若从siglongjmp调用返回则为非051Testing软件测试网3n:_%hLFm
void siglongjmp(sigjmp_buf env, int val);
8e ??,@T9iR0——————————————————————————————————

*Y^#\!Lk+s!q3_a#e051Testing软件测试网 lx-o@A0Y.s!E

10.16 sigsuspend函数
#S(Wz3q/Jc0一个原子操作中实现恢复信号屏蔽字,然后使进程睡眠,这种功能是由sigsuspend函数所提供的。
(_]R/l,yR0——————————————————————————————————
6O p zM#J:Fp;k0#include <signal.h>51Testing软件测试网]d'qj._"})i
int sigsuspend(const sigset_t *sigmask) ;
zV^J(H0返回:-1, errno设置为EINTR
0F"zH^9Me0——————————————————————————————————

%u-l ? Zi0

|`m4JDBL3ep010.17 abort函数51Testing软件测试网3pIRs8I m"Su
abort函数的功能是使程序异常终止。51Testing软件测试网 Qv.{| f8@c|eT
——————————————————————————————————
tI(ku:W(p y3t!_0#include <stdlib.h>51Testing软件测试网)k*U4h5},Bj?dB6L
void abort(void);51Testing软件测试网:S u4qvjh
此函数不返回51Testing软件测试网`bT&BF.^&~3Lsw
——————————————————————————————————51Testing软件测试网/['LEG;sTG
此函数将SIGABRT信号发送给调用进程。进程不应忽略此信号。
%z N#fO;Z1N b;} x0ANSI C要求若捕捉到此信号而且相应信号处理程序返回, abort仍不会返回到其调用者。51Testing软件测试网&w+V g'zT0EO|n

51Testing软件测试网#J#a{a,ZC[

10.18 system 函数
X2[f'K9B vC c^g0POSIX.2要求system忽略SIGINT和SIGQUIT,阻塞SIGCHLD。
X-o~(^4J ]d v"Y9d0因为由system执行的命令可能是交互作用命令,以及因为system的调用者在程序执行时放弃了控制,等待该执行程序的结束,所以system的调用者就不应接收这两个终端产生的信号。
5v!b!p#UAW^&S:F#[0system的返回值是shell的终止状态,它不总是执行命令字符串进程的终止状态。51Testing软件测试网 ^nB8S&gmq N

51Testing软件测试网5FS x'C%`1U U;W#^@

10.19 sleep函数51Testing软件测试网X_Q}b8C
——————————————————————————————————
[i:eC"q9kge|8o0#include <unistd.h>
*D BA%G8p!CH{S0unsigned int sleep(unsigned int seconds);51Testing软件测试网z!?|;xda-uC
返回:0或未睡的秒数
%w9e6Eau]:o V)l @e0——————————————————————————————————
5hL-Ub T8jr0此函数使调用进程被挂起直到:
L*l-M8u ~`6~0(1) 已经过了seconds所指定的墙上时钟时间,或者
8DX$O3u3e S7e0(2) 该进程捕捉到一个信号并从信号处理程序返回。51Testing软件测试网:aTI/yd.yg(y N1X
sleep可以用alarm函数实现,但这并不是必需的。如果使用alarm,则这两个函数之间可以有交互作用。51Testing软件测试网p*w\X NF

]2}#FJ9w~'V?V'q010.20 作业控制信号
$?r;h5k%G.j/TKQ0
在表10-1中有六个POSIX.1认为是与作业控制有关的信号。51Testing软件测试网wCZIOXH'] `7V
SIGCHLD   子进程已停止或终止。51Testing软件测试网 } D#hd,h eve
SIGCONT   如果进程已停止,则使其继续运行。
ht/_&\r.N3SS0SIGSTOP   停止信号(不能被捕捉或忽略)。
"{YJh t?*C bU!V0SIGTSTP   交互停止信号。51Testing软件测试网]r+U#O!c
SIGTTIN   后台进程组的成员读控制终端。51Testing软件测试网v6F2|F{io;bw|g)E{%c
SIGTTOU   后台进程组的成员写控制终端。51Testing软件测试网3wP^(?$h6E$P jpg
大多数应用程序并不处理这些信号——交互式shell通常做处理这些信号的所有工作

i1k ri&gq*YP051Testing软件测试网]n+F C(F l@L,P

10.21 其他特征
b)R+Qj.Cz f/r0
51Testing软件测试网1J i_u}6Y%Qt2s


TAG: 编程 unix

我测故我在 引用 删除 caicai1724   /   2007-07-26 18:20:21
汗,互相支持~
MIKE 引用 删除 easylife   /   2007-07-26 11:22:26
你这里人气应该不错,借地方打个广告。呵呵

我的BLOG:HTTP://WWW.MIKE.ORG.CN

有空支持一下!
 

评分:0

我来说两句

Open Toolbar