Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1798352
  • 博文数量: 335
  • 博客积分: 4690
  • 博客等级: 上校
  • 技术积分: 4341
  • 用 户 组: 普通用户
  • 注册时间: 2010-05-08 21:38
个人简介

无聊之人--除了技术,还是技术,你懂得

文章分类

全部博文(335)

文章存档

2016年(29)

2015年(18)

2014年(7)

2013年(86)

2012年(90)

2011年(105)

分类: C/C++

2012-02-14 19:20:45

  1. #include "apue.h"

  2. volatile sig_atomic_t quitflag ; /* set nonzero by signal handler */
  3. static void
  4. sig_int(int signo)
  5. {
  6.         printf("\n interrupt ");
  7. }
  8. static void
  9. sig_quit(int signo)
  10. {
  11.         quitflag = 1; /* set flag for main loop */

  12. }
  13. int main(void )
  14. {
  15.     sigset_t newmask,oldmask,zeromask;

  16.     if (signal(SIGINT,sig_int) == SIG_ERR)
  17.         err_sys("signal(SIGINT) error");
  18.     if (signal(SIGQUIT,sig_quit) == SIG_ERR)
  19.         err_sys("signal(sigquit) error");
  20.     sigemptyset(&zeromask);
  21.     sigemptyset(&newmask);
  22.     sigaddset(&newmask,SIGQUIT);

  23.     /*
  24.      *block sigquit and save current signal mask
  25.      */
  26.     if (sigprocmask(SIG_BLOCK,&newmask,&oldmask) < 0)
  27.         err_sys("SIGPROCMASK block error");
  28.     while (quitflag == 0)
  29.         sigsuspend(&zeromask);
  30.     /*
  31.      *sigquit has been caught and is now block,do whatever
  32.      */
  33.     quitflag = 0;

  34.     /*
  35.      * reset signal mask which unblock sigquit
  36.      */
  37.     if (sigprocmask(SIG_SETMASK,&oldmask,NULL) < 0)
  38.         err_sys("SIG_SETMASK,ERROR");
  39.     exit(0);
  40. }

  1. #include "apue.h"
  2. /* reliable version of signal() ,using posix signaction()*/
  3. Sigfunc *
  4. signal(int signo,Sigfunc * func)
  5. {
  6.     struct sigaction act,oact;
  7.     
  8.     act.sa_handler = func;
  9.     sigemptyset(&act.sa_mask);
  10.     act.sa_flags = 0;
  11.     if ( signo == SIGALRM){
  12.     #ifdef SA_INTERRUPT
  13.         act.sa_flags |= SA_INTERRUPT;
  14.     #endif
  15.     } else{
  16.     #ifdef SA_RESTART
  17.         act.sa_flags |= SA_RESTART;
  18.     #endif
  19.     }
  20.     if (sigaction(signo,&act,&oact) < 0)
  21.         return(SIG_ERR);
  22.     return(oact.sa_handler);
  23. }
output of program :
  1. ubuntu@ubuntu-virtual-machine:~/Desktop/apue$ ./c10-16
  2. ^C
  3. ^C interrupt
  4. ^C interrupt
  5. ^C interrupt
  6. ^C interrupt
  7. ^C interrupt
  8. ^C interrupt
  9. ^C interrupt
  10. ^C interrupt
  11. ^\ interrupt

我的结果和书上面的不一致,第一次的中断信号被丢失,不知道什么原因?
我试过多次都是这个结果,期待高手解决,signal程序是c10-12







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