C++ signal和sigaction信号处理
本文介绍两个信号处理机制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信号处理相关推荐
- 信号捕捉(signal、sigaction)
信号的基本属性:软中断,由内核发送,内核处理.某个进程通过内核向另一个进程发送信号时(引起信号产生的五个因素),另一个进程将会陷入内核进行中断处理,未决信号集中相应信号置1,当递达后,置0.如果阻塞信 ...
- 嵌入式Linux系统编程学习之十五sigaction信号处理机制
文章目录 一.信号处理情况分析 二.sigaction 信号处理注册 三.sigprocmask 信号阻塞 一.信号处理情况分析 在 signal 处理机制下,还有许多特殊情况需要考虑: 注册一个 ...
- signal() 和 sigaction()
[摘自<Linux/Unix系统编程手册>] Unix系统提供了两种方式来改变信号处置:signal() 和 sigaction(). signal() 的行为在不同Unix实现间存在差异 ...
- Linux signal、sigaction的使用总结
目录 一.什么是信号 二.信号的种类 三.信号的处理 -- signal()函数 四.信号处理 -- sigaction()函数(扑获信号) 五.扑获信号示例 一.什么是信号 信号是UNIX和Linu ...
- Linux信号详解:signal与sigaction函数【2】
我们已经讨论了Linux操作系统中"信号"."中断"."僵尸进程"'等重要概念.结合C语言中的setjmp.longjump.sigsetj ...
- 信号【2】-理解signal和sigaction
文章目录 前言 一.signal对信号的处理 1.1 **如果进程正在执行信号处理函数,这时又接收到一个相同的信号会怎样**? 1.2 如果进程正在执行信号处理函数,这时又接收到一个不同的信号会怎样? ...
- Digital Signal Processing 数字信号处理
DSP是什么 | 数字信号处理 | 数字信号处理器 | DSP处理器与通用处理器的比较 | Digital Signal Processing 数字信号处理 作为一 ...
- linux 信号signal和sigaction理解
转载:http://blog.csdn.net/beginning1126/article/details/8680757 今天看到unp时发现之前对signal到理解实在浅显,今天拿来单独学习讨论下 ...
- 详细解释signal和sigaction以及SIG_BLOCK
signal,此函数相对简单一些,给定一个信号,给出信号处理函数则可,当然,函数简单,其功能也相对简单许多,简单给出个函数例子如下: [cpp] view plain copy 1 #include ...
最新文章
- 如何检查Go中是否存在文件?
- 第11章:MongoDB-CRUD操作--文档--查询
- java正则表示判断。是否以某个关键字结尾的
- ST公司STM32F4与STM32F1的区别
- python提取word参考文献_写作相关 | word中参考文献转化为.bib格式全流程
- C# 定义了 7 种变量类别:静态变量、实例变量、数组元素、值参数、引用参数、输出参数和局部变量
- 记录使用IDEA部署Tomcat时提示错误:the selected directory is not a TomEE home
- js多线程的实现-Worker
- 动态规划uva1347
- NYOJ-聪明的kk(dp)
- 数学中的物理、几何概念与含义
- c# WinForm开发 DataGridView控件的各种操作总结(单元格操作,属性设置)
- 数模3—Matlab线性规划、非线性规划、多目标规划(超全解法合集)
- JAVA城市道路智能停车管理系统计算机毕业设计Mybatis+系统+数据库+调试部署
- 2021年南京邮电大学自动化学院、人工智能学院考研指南
- PHP获取客户端操作系统,游览器类型及版本号
- 常用JS效果 需要时更新。。。
- 微信营销七(微信朋友圈发文技巧)
- chromium45 对应 depot_tools 和 chromium 版本
- c语言实现2048程序设计小游戏
热门文章
- 这位程序员,你知道如何挣到月薪 20000+ 吗?
- X浏览器 v3.2.2.441 官方版-好用的手机浏览器 for Android
- CCF真题之ISBN号码
- python爬虫:socket
- SQL Server触发器原理及使用
- 理解贝叶斯公式 P(A|B)P(B)=P(A)P(B|A)
- python保存图片到指定路径_用 Python 识别图片中的文字
- java 静态对象new_java 静态 new 对象
- 颜体楷书基本笔画示意图
- 新书介绍:iPhoneiPad企业移动应用开发秘籍