Chinaunix首页 | 论坛 | 博客
  • 博客访问: 735437
  • 博文数量: 803
  • 博客积分: 6000
  • 博客等级: 准将
  • 技术积分: 5015
  • 用 户 组: 普通用户
  • 注册时间: 2008-10-28 10:29
文章分类

全部博文(803)

文章存档

2011年(1)

2008年(802)

我的朋友

分类:

2008-10-29 11:44:32


  信号是unix中所使用的进程通信的一种最古老的方法.系统使用它来同志一个或多个进程异步事件的发生.
  
  系统库bits/signum.h对信号名作了定义:
  的大多数信号是提供给内核的,仅有少数几种信号可以在信号间发送.
  
  .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 恢复对这个信号的默认处理.
  
  例如:
  #include
  #include
  #include
  
  main(){
  signal(SIGINT,SIG_IGN);
  printf("hello!n");
  sleep(10);
  printf("hellon");
  }
  上面的代码忽略了SININT信号.
  
  又例如:
  #include
  #include
  #include
  
  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.信号不能打断信号处理函数.
  
【责编:admin】

--------------------next---------------------

阅读(287) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~