[学习 Linux/Unix C 编程]之(十):信号基础
上一篇 / 下一篇 2009-08-14 21:33:30 / 个人分类:Linux/Unix 编程之路
IC5c#?l0[学习 Linux/Unix C 编程]之(十):信号基础Linuxeden博客家园/]!r3zm{'Fu1d|
Linuxeden博客家园^/R(j2v1E'V#include <signal.h>Linuxeden博客家园aa6u%X2Asw i}7e*r
Linuxeden博客家园I-r:{W1f dT_,o信号(singal)是Linux/Unix 中常见的软件中断。每个信号一般以SIG打头并对应一个编号(正整数),不存在编号为0的信号。
w2vr-VsFS
Q;jn0信号的处理方式有三种:忽略信号,捕捉信号并处理,执行系统默认信号处理。默认处理情况下某些会产生core 文件以记录该进程的内存映象。Linuxeden博客家园@;hrm7Z/~/e
signal 函数:Linuxeden博客家园s1s){"DC+Dwv
void (*signal(int signo, void (*func)(int)))(int);Linuxeden博客家园'd'^,}&W,k-B:z
是最简单的信号处理接口。返回值是一个函数指针,指针指向的函数无返回值。第一参数为信号名,第二参数为当接收到该信号时要调用的处理函数,处理函数的参数是一个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
#include <stdio.h>
3Bap~!BbS;Fv"@)iB0#include <stdlib.h>
f:Bb/_e0PT M{0#include <signal.h>
//信号处理函数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%qZN ~0 else if( SIGUSR2==i )
j1K@;G![e`!O$O7ly6L0 {
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}
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-Ho{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&C
