Chinaunix首页 | 论坛 | 博客
  • 博客访问: 95320
  • 博文数量: 46
  • 博客积分: 2510
  • 博客等级: 少校
  • 技术积分: 505
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-22 19:56
文章分类
文章存档

2008年(46)

我的朋友

分类: LINUX

2008-05-06 20:36:51

在posix1中建议使用sigaction替代signal进行信号处理,因为signal不可靠。
在signal.h中定义了sigaction的结构
struct sigaction
{ sigset_t mask,
  int sa_flags;
  void (* handler)(int);
  void (* sa_sigaction)(int,siginfo_t *,void *);
}
 
mask表示在进程捕抓到信号,进行信号处理时要阻塞的信号集,默认把当前信号也包括在内,不过可以通过sa_flags进行设置了。
sa_flags为一系列宏,主要有:
SA_RESTART,因为处理信号导致不二阻塞的系统调用在信号处理函数结束后自动重启。
SA_NODEFER,不阻塞当前信号
SA_SIGINFO,信号处理函数为 sa_sigaction。(一般不用这个,除非要知道处理信号的那个进程的详细情况。)
 
在实际中往往是把sigaction封装在自定义的signal中进行处理.如:
typedef void (* sig_func)(int);
sig_func signal(int signo, sig_func func)
{  struct sigaction   nact,oact;
    sigemptyset(&nact.mask);
    sigaddset(nact.mask, SIGINT);
    nact.sa_flags=SA_RESTART|SA_NODEFER;
    nact.handler=func;
    if(sigaction(signo,nact,oact)<0)
     return SIG_ERR
   else  return oact.handler;
}
signal设置了信号的处理函数,并且返回该信号的上一次处理函数。
 
当然,这只是基本操作了,在信号处理函数中还可以调用一些其他的处理函数,例如sigsuspend,sigsetjump,siglongjump等。
总之,信号处理是unix中较难的内容,在高级unix编程中会需要使用。
 
阅读(777) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~