Chinaunix首页 | 论坛 | 博客
  • 博客访问: 969054
  • 博文数量: 200
  • 博客积分: 5011
  • 博客等级: 大校
  • 技术积分: 2479
  • 用 户 组: 普通用户
  • 注册时间: 2008-06-27 15:07
文章分类

全部博文(200)

文章存档

2009年(12)

2008年(190)

我的朋友

分类:

2008-12-08 11:42:05

10.4 unreliable signals

指的是一些老的实现中的signal机制,它们经常会导致signallost,它们具有如下特点:

1Signal handler是一次性的,需要re-install

即触发一次后就无效了,该signal的处理就自动成为以前的默认的了。所以导致如果我们想一直使用该handler,就不得不在handler函数里面再次调用signal()来安装该handler,这样就造成问题:如果在handler函数内部,即发生了signal之后,在你重新安装signal handler之前,又发生了signal呢? 这个signal的处理就会按照默认的处理了,有可能将process结束掉了。

2.我们无法禁止某个signal的发生,更无法暂时将发生的信号暂存起来,以后处理

我们有时候,想禁止signal发生,做一些活之后,在允许他发生。比如下面代码:

int     sig_int_flag;         /* set nonzero when signal occurs */

 

      main()

      {

          int      sig_int();       /* my signal handling function */

          ...

          signal(SIGINT, sig_int);  /* establish handler */

          ...

          while (sig_int_flag == 0)

              pause();              /* go to sleep, waiting for signal*/

          ...

      }

 

      sig_int()

      {

          signal(SIGINT, sig_int);  /* reestablish handler for next time */

          sig_int_flag = 1;         /* set flag for main loop to examine */

      }

如果在while()检查完毕,sig_int_flag = 0的情况下,在调用pause()之前,发生了SIGINT,那么sig_int()会被调用,sig_int_flat会被置位1,然后程序依然会执行pause(),如果该信号只发生一次,那么就再也等不到该信号了。

这个函数,在调用while之前,应该像禁止SIGINT的发生,这样在作完检查,进入pause之后才能允许SIGINT的发生。或者说系统向具有一种不让某种信号发生,或者就算你发生了,暂时将你记录下来不做通知,等到了合适的时候再允许你发生,或者还能够找到以前发生过的信号的机制。

 

3.使用reliable signal机制

好处是:reliable signal机制可以使被interruptedsystem call能够自动restart。方法是给signal handler加一个相应的标记。

Reliable signal机制可以不用每次都re-install signal handler函数

还可以enable以及disable a collection of signals即可以使能/禁用 一些signal

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