Linux中信号处理

来源:互联网 发布:帮淘宝店刷好评 违法 编辑:程序博客网 时间:2024/04/29 13:06

信号是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 ...

原创粉丝点击