展望2011

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

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

51Testing软件测试网so,r D|+x t-~

 

h?ua_ vB(z:l051Testing软件测试网 B8ZW}N#o9I

第10章 信号51Testing软件测试网m3@"r%Fz'^#y4S

'm%aUQ`wUnFW0

"GX1b7oIiF010.1 引言
%z]%u^"t'B0
信号是软件中断。它提供了一种处理异步事件的方法。

,}+I\*Yd&{G#^}051Testing软件测试网b2h]V4?h

10.2 信号的概念51Testing软件测试网]X e i o5ec(cI
字符SIG开头 头文件<signal.h>中
/}5A!?CW3]P-P!G0产生一个信号的条件:51Testing软件测试网]^!\x:mZ.M4v4b v
1.用户按某些终端键51Testing软件测试网]!^(IV;c5I
2.硬件异常产生信号
%Z;oC8OxJ$B {~:zo03.进程用kill(2)函数可将信号发送给令一个进程或进程组
v @j"o;m*`2e]-K%V04.用户可用kill(1)命令将信号发送给其他进程
(e|"pE#Z;I05.当检测到某种软件条件已经发生,并将其通知有关进程时也产生信号

T4M-wx_3@1H7O2x051Testing软件测试网A mBQI8l w2g%m2\

信号出现时的三种操作方式:51Testing软件测试网 De8| oUL e,d U"v
1.忽略此信号51Testing软件测试网'O,m[{/X2u"Y/\d
2.捕捉信号51Testing软件测试网gG&],e J3z$O;l@y
3.执行系统默认动作51Testing软件测试网N#q$uO5x1MT H.}@

([ ~)B @Pq E0表10-1 UNIX信号51Testing软件测试网d k[*G/Y%vo*}

tW&s3l/B010.3 signal函数51Testing软件测试网&|H'?Gxy Zv
signal函数为信号处理程序(signal handler)或信号捕捉函数(signal-catching function)51Testing软件测试网"~8{&@O$m,C l;LsOo
————————————————————————————————————————————————————
kKD&A7NaBw0#include <signal.h>51Testing软件测试网y B3]B Opz4^%x&g
void (*signal(int signo,void (*func)(int)))(int);51Testing软件测试网%Y0e@e \d#Y6\*C
                                             返回:成功则为以前的信号处理配置,若出错则为SIG_ERR51Testing软件测试网S ?%A9lQ!P
————————————————————————————————————————————————————51Testing软件测试网9eIa5IQ5l{

-} ]g u/D9~/a"IL#T o010.4 不可靠的信号51Testing软件测试网c3^#D UeA XP6r*c1p
10.5 中断的系统调用

)\XS8~qC0系统调用分为两类:低速系统调用和其他系统调用。低速系统调用是可能会使进程永远阻塞的一类系统调用。

QM8Q]5]y ~051Testing软件测试网$nj3i_%aEt0_L

表10-2 几种信号实现所提供的功能51Testing软件测试网%\S8u W)qB

Bym BY+l;DD010.6 可再入函数
r*l-[9w+f2FX0
进程捕捉到信号并继续执行时,首先执行该信号处理程序中的指令。如果从信号处理程序返回,则继续执行在捕捉到信号时进程正在执行的正常指令序列。
(Q'aO:^A_0如果进程正在执行某函数,由于捕捉到信号插入执行信号处理程序,其中又调用该函数,则可能会出错。所以引入了可再入函数的概念。

XiA2_A051Testing软件测试网.PMd5U"oZ}1A

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

lE |b:j$p9L V051Testing软件测试网'Z"JD"d'P.t0vN

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

9LZ {(x[!L0

)MRnVf*Eag010.8 可靠信号术语和语义51Testing软件测试网0S@_G,nyc
当造成信号的事件发生时,为进程产生一个信号,内核在进程表中设置一个标志,这个动作称之为向一个进程递送了一个信号。在信号产生(generation)和递送(delivery)之间的时间间隔内,称信号未决(pending)。
.s*lQ O8J0当递送一个原来北阻塞的信号给进程时,而不是在产生该信号时,内核才决定对它的处理方式。于是进程在信号递送给它之前仍可改变对它的动作。51Testing软件测试网[ g.k%`!X4Az2E\@

0L{3n w y,U;^J/I010.9 kill 和raise函数51Testing软件测试网6BU$[S r wog cIz7t
kill函数将信号发送给进程或进程组。raise函数则允许进程向自身发送信号。51Testing软件测试网buU$~!p
———————————————————————————————————————————————————51Testing软件测试网O#QW.nR l`
#include <sys/ttpes.h>51Testing软件测试网)joD4k/W+e'i+\W;igA:N
#include <signal.h>51Testing软件测试网-J*g9NCs N*J0Q

51Testing软件测试网H Ju5?VY~8c*~ m6Hf

int kill(pid_t pid,int signo);
4qb-mkE;lr:v0int raise(int signo);
R:r(@2r!U5b0                                  两个函数返回:若成功则为0,若出错则为-151Testing软件测试网.V qhI*YU
———————————————————————————————————————————————————
x'W._+IN:CI8\0进程将信号发送给其他进程需要许可权。51Testing软件测试网#FTL H]

u,_*}km9}I)c010.10 alarm和 pause函数
1cHM5zGkrSm0alarm函数可以设置一个时间值(闹钟时间),当所设置的时间值被超过后,产生SIGALRM信号。51Testing软件测试网*U|B0qUy1A
————————————————————————————————————————————————————51Testing软件测试网 a'_)OGEmz8S
#include <unistd.h>

(D7X1RzC] U%lt-I0

j7g-eNSP+v0unsigned int alarm(unsigned int seconds);51Testing软件测试网$\EG5T mr;U&^zj
                                     返回:0或以前设置的闹钟实践的余留秒数51Testing软件测试网jl,pU m(E*aw
————————————————————————————————————————————————————51Testing软件测试网].x&~7D^,`
每个进程只能有一个闹钟时间。大多数是使用闹钟的进程捕捉此信号。51Testing软件测试网X$O&D2Nl!r
pause函数使调用进程挂起直至捕捉到一个信号。
2a7^0V"BD-T0————————————————————————————————————————————————————
&k(zm,esT5})E0#include <unistd.h>51Testing软件测试网)r&D3o%Z5kb Roq-i
int pause(void);
0dM*RHdph8E0                                    返回:-1,errno设置为EINTR
"Gsx e!m9_!N-K0————————————————————————————————————————————————————51Testing软件测试网I/twP G8A
只有执行了一个信号处理程序并从其返回时,pause才返回。

1N(F_ j(nG8{ K*f0

I[)cjw'g0v2^{5\010.11 信号集51Testing软件测试网-t5by'Am{7w
能表示多个信号-信号集(signal set)的数据类型。
d)CL(G"h O%P0数据类型sigset_t包含一个信号集。五个处理信号集的函数:51Testing软件测试网R8Qcz8@
————————————————————————————————————————————————————
9j+\*TV5y(D]{^0#include <signal.h>
G/e8zI4ea n0int sigemptyset(sigset_t *set);
6Xt#IRo$@~0int sigfillset(sigset_t *set);51Testing软件测试网 a9k dm9f9H,E\#J.f
int sigaddset(sigset_t *set,int signo);51Testing软件测试网6AK \?1Of.}(j
int sigdelset(sigset_t *set,int signo);
bT T!BW0                                            四个函数返回:若成功则为0,若出错则为-151Testing软件测试网TD X|:ac
int sigismember(const sigset_t *set,int signo);
$u"|zBQ"N\m0                                            返回:若真则为1,若假则为0
4P;GxCLO0————————————————————————————————————————————————————
P{ EczWWe M0函数sigemptyset初始化由set指向的信号集,使排除其中所有信号。51Testing软件测试网[0{n,r,? B'Q
函数sigfillset初始化由set指向的信号集,使其包括所有信号。
.[Sq)xZ$@!QJ0所有应用程序在使用信号集前,要对该信号集调用sigemptyset或sigfillset一次。
7u)p&ta9p/TW0函数sigaddset将一个信号添加到现存集中,sigdelset则从信号集中删除一个信号。对所有以信号集作为参数的函数,都向其传送信号集地址。

&o(_r:B'JOb7[3X051Testing软件测试网 @wzq%@)iZ

10.12 sigprocmask 函数
:hU#|#^`:iP&n0
一个进程的信号屏蔽字规定了当前阻塞而不能递送给该进程的信号集。调用函数sigprocmask可以检测或更改(或两者)进程的信号屏蔽字。51Testing软件测试网3t8Dap5FmH1xK
————————————————————————————————————————
(e$rX pQX"Z!f3a0# include <signal.h>51Testing软件测试网:uemY\7z
int sigprocmask(int h o w, const sigset_t *s e t, sigset_t *o s e t) ;
~e"WZZo0返回:若成功则为0,若出错则为-151Testing软件测试网&| h(qVa+ywDf
————————————————————————————————————————

AR B`bUlj0

1W({\3mTV MA010.13 sigpending函数51Testing软件测试网9Ve a8l&^
sigpending返回对于调用进程被阻塞不能递送和当前未决的信号集。该信号集通过set参数返回。51Testing软件测试网^%kFH$z%i+m
——————————————————————————————————————————51Testing软件测试网&S9_$NeY Z1J
#include <signal.h>
lT'x'T\5P0int sigpending(sigset_t *s e t) ;
s1M0I%D,A2xk0返回:若成功则为0,若出错则为-1
e2}qSW'dD(K0——————————————————————————————————————————51Testing软件测试网;x s0g)|:h$\cc

51Testing软件测试网7y"o|1S*_!?R!_7x

10.14 sigaction函数51Testing软件测试网:zv1{b@$i4EX.@
sigaction函数的功能是检查或修改(或两者)与指定信号相关联的处理动作。此函数取代了UNIX早期版本使用的signal函数。51Testing软件测试网 E/Q}Im ~b
————————————————————————————————————
,x%WI cA3z8~Cs0#include <signal.h>51Testing软件测试网i b i-f1D'i3og#I WN
int sigaction(int signo, const struct sigaction *a c t,
s/Qw6Tz0struct sigaction *oact) ;
dWo:C1q)S,u9v$F0返回:若成功则为0,若出错则为- 151Testing软件测试网LrJo,~g5\
————————————————————————————————————51Testing软件测试网"e-z#WH%I5OB:t.[%V
struct sigaction {
J1\:K!n4~*e0void        (*sa_handler)(); /* addr of signal handler,
R"SI o7sn~0or SIG_IGN, or SIG_DFL */
P+^`Km0sigset_t sa_mask;            /* additional signals to block */
!Lm } w&b9n0c%a/B[t0int         sa_flags;        /* signal options, Table 10-5 */
Q5\g&AL%E0} ;51Testing软件测试网2R@0up5M"F3d TzdN
表10-5   信号处理的选择项标志( sa_flags)

}*xX r,]\(|.R;xt9D051Testing软件测试网Y QG;oC:|3U6P

10.15 sigsetjmp 和siglongjmp函数51Testing软件测试网!lTZ,R/E fw5el
在信号处理程序中经常调用longjmp函数以返回到程序的主循环中,而不是从该处理程序返回。
#v&@7HWMVo-v0U0POSIX.1定义了两个新函数sigsetjmp和siglongjmp。在信号处理程序中作非局部转移时应当使用这两个函数。51Testing软件测试网2j L8uzV_ Km2VXS
——————————————————————————————————
lKXj\0#include <setjmp.h>51Testing软件测试网Doh |3g1rH}W G1g
int sigsetjmp(sigjmp_buf env, int savemask) ;51Testing软件测试网 \(hK'Op;m!M R
返回:若直接调用则为0,若从siglongjmp调用返回则为非0
c8Q/[2^3l+d/O7YB0N0void siglongjmp(sigjmp_buf env, int val);51Testing软件测试网mUK*n0VS R)]$G R
——————————————————————————————————

/Gh:Ou;TUS;W051Testing软件测试网1kbaO:i { ?t;\

10.16 sigsuspend函数
2h8PjF#BI|4b0一个原子操作中实现恢复信号屏蔽字,然后使进程睡眠,这种功能是由sigsuspend函数所提供的。
8J*N3f,H}0——————————————————————————————————51Testing软件测试网7|7_ `jM0o;T
#include <signal.h>51Testing软件测试网MP+Y/J*N
int sigsuspend(const sigset_t *sigmask) ;
%R;l"U x+eRm9U0返回:-1, errno设置为EINTR51Testing软件测试网H!k6I"PQ+O!UC{)^Kg,J
——————————————————————————————————51Testing软件测试网;q:JX)L!W*z*M0]e

+LK1HGQ/S&h010.17 abort函数
;eI$eNuq!sc8E0
abort函数的功能是使程序异常终止。
jp{^(`6Q tz0——————————————————————————————————
4~FK5jL*]0#include <stdlib.h>51Testing软件测试网8{:O Qy u$GS1a%F
void abort(void);
8s#v%s3wZ0U{)O0此函数不返回51Testing软件测试网wg&MTB7Pf
——————————————————————————————————
+Zk:ix:O2}0此函数将SIGABRT信号发送给调用进程。进程不应忽略此信号。51Testing软件测试网t-p%G a\Ym-NSD6L
ANSI C要求若捕捉到此信号而且相应信号处理程序返回, abort仍不会返回到其调用者。51Testing软件测试网'B9p&Y#SuFq

51Testing软件测试网'T3XLAFVB3Hk

10.18 system 函数51Testing软件测试网|)i]5f0GZ H`\L
POSIX.2要求system忽略SIGINT和SIGQUIT,阻塞SIGCHLD。51Testing软件测试网p+?&e5kHX
因为由system执行的命令可能是交互作用命令,以及因为system的调用者在程序执行时放弃了控制,等待该执行程序的结束,所以system的调用者就不应接收这两个终端产生的信号。51Testing软件测试网!P7R6zR8t M._:twC
system的返回值是shell的终止状态,它不总是执行命令字符串进程的终止状态。

Q/@ F,W i/e UjH/{051Testing软件测试网:B@\Wa6h]+|(nR1RB4v

10.19 sleep函数
5B*C?ej\2CM0
——————————————————————————————————
l$r)yH)kc0#include <unistd.h>51Testing软件测试网lcUyE EH,~0M
unsigned int sleep(unsigned int seconds);51Testing软件测试网R;f#j.gV.~"P'Z"H}+g$\r
返回:0或未睡的秒数51Testing软件测试网P(ok0er y@,f
——————————————————————————————————
&kW{~Lt0此函数使调用进程被挂起直到:
DVR%hBO'u0(1) 已经过了seconds所指定的墙上时钟时间,或者51Testing软件测试网)}r {df
(2) 该进程捕捉到一个信号并从信号处理程序返回。
pr5r7lv1KL0sleep可以用alarm函数实现,但这并不是必需的。如果使用alarm,则这两个函数之间可以有交互作用。51Testing软件测试网V}oEj+x&\+O

C)jk `yM010.20 作业控制信号51Testing软件测试网XY~,]V{&h] p
在表10-1中有六个POSIX.1认为是与作业控制有关的信号。
&n2Kh|%]F!}8k"P0SIGCHLD   子进程已停止或终止。
e(s6{s,x+Ff4d0SIGCONT   如果进程已停止,则使其继续运行。51Testing软件测试网Z c.N ?^ZN
SIGSTOP   停止信号(不能被捕捉或忽略)。51Testing软件测试网 dZNL3];h s8p*SU1_ `
SIGTSTP   交互停止信号。
~*f.u EU7H0SIGTTIN   后台进程组的成员读控制终端。
n&u5R7bAT bhlz0SIGTTOU   后台进程组的成员写控制终端。
T7U+\-n%g&\8QB0大多数应用程序并不处理这些信号——交互式shell通常做处理这些信号的所有工作

6V y3GK @G051Testing软件测试网t.D5G}/Q/ee(F#w%^8f3A

10.21 其他特征
]x$lJjB k0
51Testing软件测试网A#ML6\q yOM!J2f$~


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