分类: Linux开发 2006-04-30 16:04 24475人阅读 收藏 举报
信号是unix中所使用的进程通信的一种最古老的方法.系统使用它来同志一个或多个进程异步事件的发生.
linux系统库bits/signum.h对信号名作了定义:
linux的大多数信号是提供给内核的,仅有少数几种信号可以在信号间发送.
.SIGHUP
当终止一个终端时,内核就把这种信号发送给该终端所控制的所有进程.
.SIGINT
当一个用户按下中断键(ctrl+c)后,内核就向该终端用关联的所有进程发送这个信号.
.SIGQUIT
当用户按下(ctrl+),内核就向该终端用关联的所有进程发送这个信号.
.SIGILL
当一个进程企图执行一条非法指令时,内核就发送这个信号.
.SIGFPE 当产生浮点错误时,内核就发送这个信号.
.SIGKILL
这是一个非常特殊的信号,他可以从一个进程发送到另一个进程,使接收到该信号的进程终止.内核偶然也发送这种信号.
.SIGALRM
当一个定时器到时的时候,内核就发送这个信号.
.SIGSTOP
子进程结束信号.UNIX用它来实现系统调用exit(),wait();
信号的处理
unix的系统调用signal()用于接受一个指定的信号,并可以指定相应的处理方法.
在linux系统库signal.h中,它的说明如下:
signal(int
sig,sighandler_t
handler);
sig用于指定信号类型.handle是用于处理该信号的函数.
handle还可以是:
.SIG_IGN
忽略这个信号.
.SIG_DFL
恢复对这个信号的默认处理.
例如:
main(){
signal(SIGINT,SIG_IGN);
printf(”hello!n”);
sleep(10);
printf(”hellon”);
}
上面的代码忽略了SININT信号.
又例如:
int
catch(int
sig);
main(){
signal(SIGINT,catch);
printf(”hello!n”);
sleep(10);
printf(”hello!n”);
}
int
catch(int sig){
printf(”catch signaln”);
return
1;
}
当用户按下ctrl+c时,进程被中断,catch()被执行.中断处理函数处理完毕后,转回断点执行下面的指令.
当编写自己的中断处理函数时,注意下面两点:
1.信号不能打断系统调用.
2.信号不能打断信号处理函数.
alarm(设置信号传送闹钟)
定义函数
unsigned int alarm(unsigned int
seconds);
函数说明
alarm()用来设置信号SIGALRM在经过参数seconds指定的秒数后传送给目前的进程。如果参数seconds
为0,则之前设置的闹钟会被取消,并将剩下的时间返回。
返回值
返回之前闹钟的剩余秒数,如果之前未设闹钟则返回0。
范例
void
handler() {
printf("hellon");
}
main()
{
int
i;
signal(SIGALRM,handler);
alarm(5);
for(i=1;i<7;i++){
printf("sleep
%d ...n",i);
sleep(1);
}
}
执行
sleep 1 ...
sleep 2 ...
sleep
3 ...
sleep 4 ...
sleep 5 ...
hello
sleep 6 ...
阅读(869) | 评论(0) | 转发(0) |