关于作者

[学习 Linux/Unix C 编程]之(十):信号基础

上一篇 / 下一篇  2009-08-14 21:33:30 / 个人分类:Linux/Unix 编程之路

IC5c#?l0[学习 Linux/Unix C 编程]之(十):信号基础Linuxeden博客家园/]!r3z m{'Fu1d|

Linuxeden博客家园 ^/R(j2v1E'V

#include <signal.h>Linuxeden博客家园aa6u%X2Aswi }7e*r

Linuxeden博客家园I-r:{W1fdT_,o

信号(singal)是Linux/Unix 中常见的软件中断。每个信号一般以SIG打头并对应一个编号(正整数),不存在编号为0的信号。 
w2vr-VsFS Q;jn0信号的处理方式有三种:忽略信号,捕捉信号并处理,执行系统默认信号处理。默认处理情况下某些会产生core 文件以记录进程的内存映象。Linuxeden博客家园 @;hrm7Z/~/e

Linuxeden博客家园TmL;v5zM.?

signal 函数Linuxeden博客家园s1s){"DC+Dwv
void (*signal(int signo, void (*func)(int)))(int);Linuxeden博客家园'd'^,}&W,k-B:z

Linuxeden博客家园5y`%|X e1veE2}

是最简单的信号处理接口。返回值是一个函数指针,指针指向的函数无返回值。第一参数为信号名,第二参数为当接收到该信号时要调用的处理函数,处理函数的参数是一个int类型参数,没有返回值。Linuxeden博客家园,vG%zu8}k]+i

rpy1Q+?k&G)rt$^O$`0signal 函数基本用法,kill命令 默认发送 SIGTERM信号 是杀死指定PID的进程,可以通过kill命令发送其它信号给进程:Linuxeden博客家园;c%[+Mnm)[l

!T ?4a+L!s0--------------------------------------------------------------------------Linuxeden博客家园,q.e9Y;Q9H A F#K
// testsignal.c

^[n;]$p0Linuxeden博客家园.[5[d AR[

#include <stdio.h>
3Bap~!BbS;F v"@)iB0#include <stdlib.h>
f:Bb/_e0PTM{0#include <signal.h>

H*^![;Nr+W4m;B$x0Linuxeden博客家园.Q6KU8f+aD

//信号处理函数Linuxeden博客家园"]I7]q;HNR
static void sig_usr(int i)
7JB\7g$yHc$j iU0{
mY hC$H}m0 if( SIGUSR1==i )
mjw L#[]0 {Linuxeden博客家园 TI ~y*kGa-t
  printf("SIGUSR1111\n");Linuxeden博客家园w ?l9O)EX/?}$j-u.x
 }
)_"W%qZ N ~0 else if( SIGUSR2==i )
j1K@;G![e `!O$O7l y6L0 {
UkO&kheg6TT.N0  printf("SIGUSR2222\n");Linuxeden博客家园 Oq2X+r]0h
 }
J2r;Lj/D_;k4`0 else
Y`!L7k,sz9|0 {
V1Tp)vw6uUr0  printf("SIGNO=%d\n", i );Linuxeden博客家园 `X!fVjk;F
 }
SB1s:py0j,Es0}

,T0yX@7c,H0Linuxeden博客家园%wg6w(^KivI2Td

int main()
\?.B.Y:cYP9g:n/}0{Linuxeden博客家园7t `6t'W}A*I
 // SIGUSR1,SIGUSR2 为两个用户自定义信号
!U%w\lQL.NKH0 if( SIG_ERR==signal(SIGUSR1,sig_usr) ) Linuxeden博客家园,ft$QW+LX
  printf("signal SIGUSR1 error\n");
X^D-H o{0 if( SIG_ERR==signal(SIGUSR2,sig_usr) )
5yo,m a {`(Y0  printf("signal SIGUSR2 error\n");Linuxeden博客家园M6]x~w5z
 Linuxeden博客家园,p.Xc+H qd!nWDF(x
 // 循环等待信号Linuxeden博客家园E(Hr0FP jlU
 for( ; ; )
~2oa&Cgf9f/me@0  pause();
8d v6O^:g1C0}Linuxeden博客家园nl8ftW

5UCM%`x|0--------------------------------------------------------------------------

MGt}dA0

eru8A,i#`K]:a0[sand@localhost t_signal]$ ./t_signal &Linuxeden博客家园e0h Y,Y1P
[1] 5937
S#I!B+[ O0[sand@localhost t_signal]$Linuxeden博客家园!eKAgp
[sand@localhost t_signal]$Linuxeden博客家园3i J$i4B'Lf6Mz
[sand@localhost t_signal]$ kill -USR1 5937
"yCM.~muJ/p v0[sand@localhost t_signal]$ SIGUSR1111Linuxeden博客家园,x7Jj9rlV

mwZ)r:HDn0[sand@localhost t_signal]$ kill -USR2 5937
!R/zfv)cn/D/Y"t0[sand@localhost t_signal]$ SIGUSR2222

_{$A Cm m0Linuxeden博客家园/U^7C,ul3N;wy

[sand@localhost t_signal]$Linuxeden博客家园/q&G6IIeu [g!O&M;O
[sand@localhost t_signal]$ kill -USR2 5937
Z`_}J0[sand@localhost t_signal]$ SIGUSR2222

$z(N4^-vu rq0Linuxeden博客家园O$B)D%_(J6TL6b7VOq~

[sand@localhost t_signal]$ kill -USR1 5937
!O-q0]cK*m u|0[sand@localhost t_signal]$ SIGUSR1111Linuxeden博客家园.i ]o9q"o"qy{&R7S

Linuxeden博客家园3KTHtk5V+\ i

[sand@localhost t_signal]$ kill -SIGTERM 5937
ds)A)RQ.~2a#_0[sand@localhost t_signal]$Linuxeden博客家园*n(p5@]&Z7FT
[1]+  已终止                  ./t_signal

{X f;lL0oc&R0

1E h^3`s2kJ8K0
UpGc#y/_0--------------------------------------------------------------------------

h,u0tn6g"z x0Linuxeden博客家园 U R O-G p-e,v

Linuxeden博客家园i x5Ql#J'\ mA:q
就这么的,在后台运行程序,通过 kill 分别发送 SIGUSR1 和 SIGUSR2,分别打印出该信号的处理语句,最后发送 SIGTERM 结束了进程。Linuxeden博客家园u@:G6Ko oq"_

V/O1q&uO*|G0

TAG: 信号 signal

身边软件 引用 删除 c-aries   /   2009-08-16 14:08:40
5
身边软件 引用 删除 c-aries   /   2009-08-16 14:08:22
在<<The Design of The UNIX System>>里学过一下
 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)