Chinaunix首页 | 论坛 | 博客
  • 博客访问: 849908
  • 博文数量: 213
  • 博客积分: 5048
  • 博客等级: 大校
  • 技术积分: 1883
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-14 10:14
文章分类

全部博文(213)

文章存档

2011年(4)

2010年(55)

2009年(47)

2008年(107)

我的朋友

分类: LINUX

2008-11-07 10:12:19

本文主要参考《unix环境高级编程》
 
sigaction函数的功能是检查或修改与指定信号相关联的处理动作(可同时两种操作)。
 

int sigaction(int signo,const struct sigaction *restrict act,

              struct sigaction *restrict oact);

结构sigaction定义如下:

struct sigaction{
  void (*sa_handler)(int);
  sigset_t sa_mask;
  int sa_flag;
  void (*sa_sigaction)(int,siginfo_t *,void *);
};

sa_handler字段包含一个信号捕捉函数的地址

sa_mask字段说明了一个信号集,在调用该信号捕捉函数之前,这一信号集要加进进程的信号屏蔽字中。仅当从信号捕捉函数返回时再将进程的信号屏蔽字复位为原先值。

sa_flag是一个选项,主要理解两个

SA_INTERRUPT 由此信号中断的系统调用不会自动重启
SA_RESTART 由此信号中断的系统调用会自动重启

SA_SIGINFO 提供附加信息,一个指向siginfo结构的指针以及一个指向进程上下文标识符的指针

最后一个参数是一个替代的信号处理程序,当设置SA_SIGINFO时才会用他,具体有些烦,暂时用不到,不看了。

下面的代码是用sigaction实现signal函数:

 

#include "apue.h"
Sigfunc *signal(int signo,Sigfunc *func)
{
  struct sigaction act;//新的信号关联信息

  struct sigaction oact;//老的信号关联信息

  act.sa_handler = func;//新的信号处理函数

  sigemptyset(&act.sa_mask);//初始化屏蔽字

  act.sa_flags = 0;//初始化flags

  if (signo == SIGALRM) {//不会重启动
#ifdef SA_INTERRUPT
     act.sa_flags |= SA_INERRUPT;
#endif
  } else { //重启动
#ifdef SA_RESTART
     act.sa_flags |= SA_RESTART;
#endif
  }
  if (sigaction(signo, &act, &oact) < 0)//新老交换
      return(SIG_ERR);
   return (oact.sa_handler);
}

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

chinaunix网友2009-02-13 10:11:02

真是有用的知识,基础的很难找啊