免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1073 | 回复: 0
打印 上一主题 下一主题

sigaction函数 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-11-07 10:12 |只看该作者 |倒序浏览
本文主要参考《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);
}


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u2/66435/showart_1385785.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP