sigaction函数的功能是检查或修改与指定信号相关联的处理动作(可同时两种操作)。
他是POSIX的信号接口,而signal()是标准C的信号接口(如果程序必须在非POSIX系统上运行,那么就应该使用这个接口)
给信号signum设置新的信号处理函数act, 同时保留该信号原有的信号处理函数oldact
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时才会用他。
例子:
#include
#include
#include
void show_handler(int sig)
{
printf("I got signal %d\n", sig);
int i;
for(i = 0; i < 5; i++) {
printf("i = %d\n", i);
sleep(1);
}
}
int main(void)
{
int i = 0;
struct sigaction act, oldact;
act.sa_handler = show_handler;
sigaddset(&act.sa_mask, SIGQUIT); //见注(1)
act.sa_flags = SA_RESETHAND | SA_NODEFER; //见注(2)
//act.sa_flags = 0; //见注(3)
sigaction(SIGINT, &act, &oldact);
while(1) {
sleep(1);
printf("sleeping %d\n", i);
i++;
}
}
注:
(1)    如果在信号SIGINT(Ctrl + c)的信号处理函数show_handler执行过程中,本进程收到信号SIGQUIT(Crt+\),将阻塞该信号,直到show_handler执行结束才会处理信号SIGQUIT。
(2)    SA_NODEFER       一般情况下, 当信号处理函数运行时,内核将阻塞<该给定信号 -- SIGINT>。但是如果设置了SA_NODEFER标记, 那么在该信号处理函数运行时,内核将不会阻塞该信号。 SA_NODEFER是这个标记的正式的POSIX名字(还有一个名字SA_NOMASK,为了软件的可移植性,一般不用这个名字)    
SA_RESETHAND    当调用信号处理函数时,将信号的处理函数重置为缺省值。 SA_RESETHAND是这个标记的正式的POSIX名字(还有一个名字SA_ONESHOT,为了软件的可移植性,一般不用这个名字)   
(3)    如果不需要重置该给定信号的处理函数为缺省值;并且不需要阻塞该给定信号(无须设置sa_flags标志),那么必须将sa_flags清零,否则运行将会产生段错误。但是sa_flags清零后可能会造成信号丢失!

sigaction

sigaction(查询或设置信号处理方式)   相关函数 signal,sigprocmask,sigpending,sigsuspend, sigemptyset   表头文件 #include   定义函数 int sigaction(int signum,const struct sigaction *act ,struct sigaction *oldact);   函数说明 sigaction()会依参数signum指定的信号编号来设置该信号的处理函数。参数signum可以指定SIGKILL和SIGSTOP以外的所有信号。   如参数结构sigaction定义如下   struct sigaction {   union{   __sighandler_t sa_handler;   void (*_sa_sigaction)(int,struct siginfo *, void *);   }_u   sigset_t sa_mask;   unsigned long sa_flags;   void (*sa_restorer)(void);   }   信号处理函数可以采用void (*sa_handler)(int)或void (*sa_sigaction)(int, siginfo_t *, void *)。到底采用哪个要看sa_flags中是否设置了SA_SIGINFO位,如果设置了就采用void (*sa_sigaction)(int, siginfo_t *, void *),此时可以向处理函数发送附加信息;默认情况下采用void (*sa_handler)(int),此时只能向处理函数发送信号的数值。   sa_handler此参数和signal()的参数handler相同,代表新的信号处理函数,其他意义请参考signal()。   sa_mask 用来设置在处理该信号时暂时将sa_mask 指定的信号搁置。   sa_restorer 此参数没有使用。   sa_flags 用来设置信号处理的其他相关操作,下列的数值可用。    sa_falgs还可以设置其他标志:   SA_RESETHAND:当调用信号处理函数时,将信号的处理函数重置为缺省值SIG_DFL   ··SA_RESTART:如果信号中断了进程的某个系统调用,则系统自动启动该系统调用   SA_NODEFER :一般情况下, 当信号处理函数运行时,内核将阻塞该给定信号。但是如果设置了 SA_NODEFER标记, 那么在该信号处理函数运行时,内核将不会阻塞该信号   sigaction

sigaction()

示例

  #include   static void int_hander(int s)
  {
  printf("Catch a signal sigint\n");
  }   int   main(void)   {   int i;   struct sigaction act, oact;   act. sa_handler = int_hander;   sigemptyset(&act. sa_mask); //清空此信号集   act. sa_flags = 0;   sigaction(SIGINT, &act, &oact);   //signal(SIGINT, SIG_IGN);   while(1){   for(i=0; i<5; i++){   write(1, ".", 1);   sleep(1);   }   write(1, "\n", 1);   }   sigaction(SIGINT, &oact, NULL); //恢复成原始状态   return 0;   }

sigaction函数的使用相关推荐

  1. sigaction 函数,sigemptyset()函数,fcntl()函数,isatty()函数

    第一个函数:使用 sigaction函数: signal 函数的使用方法简单,但并不属于POSIX标准,在各类UNIX平台上的实现不尽相同,因此其用途受 到了一定的限制.而 POSIX标准定义的信号处 ...

  2. sigaction函数解析

    sigaction函数的功能是检查或修改与指定信号相关联的处理动作(可同时两种操作). 他是POSIX的信号接口,而signal()是标准C的信号接口(如果程序必须在非POSIX系统上运行,那么就应该 ...

  3. UNIX环境编程学习笔记(25)——信号处理进阶学习之 sigaction 函数

    lienhua34 2014-11-05 sigaction 函数跟 signal 函数一样,用于设置信号处理函数.此函数是用于取代 UNIX 早期版本使用的 signal 函数.UNIX 早期版本的 ...

  4. sigaction函数使用实例

    sigaction函数 (1)sigaction函数原型 sigaction函数用来查询和设置信号处理方式,它是用来替换早期的signal函数.sigaction函数原型及说明如下: sigactio ...

  5. Linux 进程学习(四)------ sigaction 函数

    转自:http://www.cnblogs.com/wblyuyang/archive/2012/11/13/2768923.html 使用 sigaction 函数:  signal 函数的使用方法 ...

  6. 信号的捕捉与sigaction函数

    一.内核如何实现信号的捕捉 如果信号的处理动作是用户自定义函数,在信号递达时就调用这个函数,这称为捕捉信号.由于信号处理函数的代码是在用户空间的,处理过程比较复杂,举例如下: 1. 用户程序注册了SI ...

  7. 信号、signal 函数、sigaction 函数

    文章目录 1.信号的基本概念 2.利用 kill 命令发送信号 3.信号处理的相关动作 4.信号与 signal 函数 4.1 signal 函数示例一 4.2 signal 函数示例二 5.利用 s ...

  8. 信号的用法,signal函数、sigaction函数及信号集(sigemptyset,sigaddset)操作函数

    信号是与一定的进程相联系的.也就是说,一个进程可以决定在进程中对哪些信号进行什 么样的处理.例如,一个进程可以忽略某些信号而只处理其他一些信号:另外,一个进程还可以选择如何处理信号.总之,这些总与特定 ...

  9. sigaction函数中关于sa_mask的解释

    使用 man sigaction 查看手册,对sa_mask的描述是这样的: sa_mask  specifies  a  mask  of  signals which should be bloc ...

  10. linux sigaction函数 sa_flags的值

    开始对sa_flags有疑问,网上搜到都是这一个程序,就复制来说事: 代码: 1 #include <stdio.h>   2 #include <stdlib.h>   3 ...

最新文章

  1. Calling Oracle stored procedures from Microsoft.NET
  2. mysql的delete的底层实现_MySQL索引的底层实现
  3. c语言农夫过河游戏代码解释,农夫过河C++代码
  4. 自适应滤波实例之系统辨识
  5. python torch exp_学习Pytorch过程遇到的坑(持续更新中)
  6. web前端的渐进增强式开发模型
  7. java数组比较的头文件_Java和C++的数组比较
  8. 读《大道至简》第四章有感
  9. spark 把一列数据合并_Spark DataFrame列的合并与拆分
  10. 2010年,您还不“工作流”吗?
  11. vue项目中出现cannot get/的解决办法
  12. 交换机设备登录账号权限1_Stelnet(ssh)登陆华为交换机配置教程
  13. 高清优质PPT模板20篇下载(金融投资系列)
  14. 笔记本键盘进水失灵,禁用方法
  15. android studio 初始化项目加载时间过长或失败问题解决
  16. 包干到户是最好的软件项目管理方法
  17. 什么,3行Python代码就能获取海量数据?
  18. Java实现包含多级目录文件的筛选删除操作
  19. Hadoop3.x集群搭建及配置的完整操作流程
  20. 中式英语之鉴读书笔记(上)

热门文章

  1. VE对环境和社会的贡献
  2. html数组删除指定元素,JS实现数组删除指定元素功能示例
  3. 视觉SLAM十四讲第十讲
  4. 证件识别OCR技术特点
  5. 什么耳机戴着舒服耳朵不疼?不塞耳道的骨传导耳机
  6. VS code内置浏览器插件-Preview on Web Server
  7. 糯米团—重制“iPhone团购信息客户端”(四)
  8. java模拟电脑体育彩票的随机选号_利用JS来模拟体育彩票选号器
  9. visual basic自定义排序
  10. 国产工业软件做的如何?