本文介绍两个信号处理机制signal和sigaction。

一 signal

void (*signal(int signo, void (*func)(int)))(int); // 该函数在不同的linux系统中可能会存在差别,该函数现在很少用
 参数:int signo, void(* func)(int)
 返回类型:参数为int型,返回void型函数指针
 调用上述函数时,第一个参数为特殊情况信息,第二个参数为特殊情况下要调用的函数的地址值(指针)。当发生第一个参数
 代表的情况的时候,调用第二个参数所指的函数。

singal函数中注册的部分特殊情况和对应的常数
 SIGALRM:已到通过调用alarm函数注册的时间
 SIGINT:输入CTRL+C
 SIGCHLD:子进程终止

unsigned int alarm(unsigned int seconds)
 该函数接收一个正整型参数,相应的时间(以秒为单位)后将产生SIGALRM信号,若向该函数传递0,则之前对SIGALRM信号的预约将取消
 如果通过该函数预处理信号后未指定该信号对应的处理函数,则终止进程,不做任何处理。

示例:(产生信号时会唤醒处于睡眠状态的进程,所以下面的示例执行不到100秒)

/* 示例使用signal,每2秒产生一个信号 */
#include <stdio.h>
#include <unistd.h>
#include <signal.h>void timeout(int sig)  //定义一个信号处理函数,该类型的函数称为信号处理器
{if(sig==SIGALRM){puts("time out!");}alarm(2);  //2秒产生一个SIGALRM信号
}void keycontrol(int sig)  //定义一个信号处理函数,该类型的函数称为信号处理器
{if(sig==SIGINT){puts("ctrl + C pressed");}
}int main(int argc, char *argv[])
{int i;signal(SIGALRM, timeout);signal(SIGINT, keycontrol);alarm(2);for(i=0;i<3;i++){puts("waits...");sleep(100);}return 0;
}

二 sigaction

int sigaction(int signo, const struct sigaction * act, struct sigaction * oldact);
 参数:
 signo与signal相同,产生信号信息
 act对应于第一个参数的信号处理函数信息
 oldact通过次参数获取之前注册的信号处理函数指针,若不需要则传递0
 sigaction结构体变量
 sigaction
 {
    void (*sa_handler)(int); // 保存信号处理函数的指针值
    sigset_t sa_mast;  //可初始化为0
    int sa_flags; // 可初始化为0
 }

#include <stdio.h>
#include <unistd.h>
#include <signal.h>void timeout(int sig)
{if(sig==SIGALRM){puts("time out");}alarm(2);
}
int main(void)
{int i;struct sigaction act;  //声明结构体类型act.sa_handler = timeout;  //保存函数指针sigemptyset(&act.sa_mask);  //将sa_mask初始化为0act.sa_flags = 0;sigaction(SIGALRM, &act, 0);alarm(2);for(i=0; i<3; i++){puts("wait...");sleep(100);}return 0;
}

C++ signal和sigaction信号处理相关推荐

  1. 信号捕捉(signal、sigaction)

    信号的基本属性:软中断,由内核发送,内核处理.某个进程通过内核向另一个进程发送信号时(引起信号产生的五个因素),另一个进程将会陷入内核进行中断处理,未决信号集中相应信号置1,当递达后,置0.如果阻塞信 ...

  2. 嵌入式Linux系统编程学习之十五sigaction信号处理机制

    文章目录 一.信号处理情况分析 二.sigaction 信号处理注册 三.sigprocmask 信号阻塞 一.信号处理情况分析   在 signal 处理机制下,还有许多特殊情况需要考虑: 注册一个 ...

  3. signal() 和 sigaction()

    [摘自<Linux/Unix系统编程手册>] Unix系统提供了两种方式来改变信号处置:signal() 和 sigaction(). signal() 的行为在不同Unix实现间存在差异 ...

  4. Linux signal、sigaction的使用总结

    目录 一.什么是信号 二.信号的种类 三.信号的处理 -- signal()函数 四.信号处理 -- sigaction()函数(扑获信号) 五.扑获信号示例 一.什么是信号 信号是UNIX和Linu ...

  5. Linux信号详解:signal与sigaction函数【2】

    我们已经讨论了Linux操作系统中"信号"."中断"."僵尸进程"'等重要概念.结合C语言中的setjmp.longjump.sigsetj ...

  6. 信号【2】-理解signal和sigaction

    文章目录 前言 一.signal对信号的处理 1.1 **如果进程正在执行信号处理函数,这时又接收到一个相同的信号会怎样**? 1.2 如果进程正在执行信号处理函数,这时又接收到一个不同的信号会怎样? ...

  7. Digital Signal Processing 数字信号处理

    DSP是什么       | 数字信号处理 | 数字信号处理器 | DSP处理器与通用处理器的比较 |       Digital Signal Processing 数字信号处理       作为一 ...

  8. linux 信号signal和sigaction理解

    转载:http://blog.csdn.net/beginning1126/article/details/8680757 今天看到unp时发现之前对signal到理解实在浅显,今天拿来单独学习讨论下 ...

  9. 详细解释signal和sigaction以及SIG_BLOCK

    signal,此函数相对简单一些,给定一个信号,给出信号处理函数则可,当然,函数简单,其功能也相对简单许多,简单给出个函数例子如下: [cpp] view plain copy 1 #include  ...

最新文章

  1. 如何检查Go中是否存在文件?
  2. 第11章:MongoDB-CRUD操作--文档--查询
  3. java正则表示判断。是否以某个关键字结尾的
  4. ST公司STM32F4与STM32F1的区别
  5. python提取word参考文献_写作相关 | word中参考文献转化为.bib格式全流程
  6. C# 定义了 7 种变量类别:静态变量、实例变量、数组元素、值参数、引用参数、输出参数和局部变量
  7. 记录使用IDEA部署Tomcat时提示错误:the selected directory is not a TomEE home
  8. js多线程的实现-Worker
  9. 动态规划uva1347
  10. NYOJ-聪明的kk(dp)
  11. 数学中的物理、几何概念与含义
  12. c# WinForm开发 DataGridView控件的各种操作总结(单元格操作,属性设置)
  13. 数模3—Matlab线性规划、非线性规划、多目标规划(超全解法合集)
  14. JAVA城市道路智能停车管理系统计算机毕业设计Mybatis+系统+数据库+调试部署
  15. 2021年南京邮电大学自动化学院、人工智能学院考研指南
  16. PHP获取客户端操作系统,游览器类型及版本号
  17. 常用JS效果 需要时更新。。。
  18. 微信营销七(微信朋友圈发文技巧)
  19. chromium45 对应 depot_tools 和 chromium 版本
  20. c语言实现2048程序设计小游戏

热门文章

  1. 这位程序员,你知道如何挣到月薪 20000+ 吗?
  2. X浏览器 v3.2.2.441 官方版-好用的手机浏览器 for Android
  3. CCF真题之ISBN号码
  4. python爬虫:socket
  5. SQL Server触发器原理及使用
  6. 理解贝叶斯公式 P(A|B)P(B)=P(A)P(B|A)
  7. python保存图片到指定路径_用 Python 识别图片中的文字
  8. java 静态对象new_java 静态 new 对象
  9. 颜体楷书基本笔画示意图
  10. 新书介绍:iPhoneiPad企业移动应用开发秘籍