[学习笔记]信号基本概念(中断和信号)/名称及常用信号/信号处理/signal函数实践
1基本概念
中断 q 中断是系统对于异步事件的响应 q 中断信号 q 中断源 q 现场信息 q 中断处理程序 q 中断向量表 异步事件的响应:进程执行代码的过程中可以随时被打断,然后去执行异常处理程序 生活中的中断和计算机系统中的中断 1) 无中断生活场景 张三看书,厨房烧水 2)有中断的生活场景 张三看书,设置闹钟,厨房烧水。 闹钟发出中断信号,张三把书合好(第20页),去厨房把开水事情处理好,张三重新打开20页进行阅读。 3)计算机系统的中断场景 中断源发出中断信号,CPU判断中断是否屏蔽屏蔽、保护现场 ,cpu执行中断处理程序, cpu恢复现场,继续原来的任务。 中断向量表保存了中断处理程序的入口地址。 中断个数固定,操作系统启动时初始化中断向量表。 中断有优先级(有人敲门,有人打电话,有优先级) 中断可以屏蔽(张三可以屏蔽电话)。 |
中断分类 q 外部中断是指由外部设备通过硬件请求的方式产生的中断,也称为硬件中断 q 内部中断是由CPU运行程序错误或执行内部程序调用引起的一种中断,也称为软件中断。 q |
信号概念 |
q q q |
信号和中断的区别 q q q q q q q q q |
2信号名称及常用信号
信号名称 描述 SIGABRT 进程停止运行 6 SIGALRM 警告钟 SIGFPE 算述运算例外 SIGHUP 系统挂断 SIGILL 非法指令 SIGINT 终端中断 2 SIGKILL 停止进程(此信号不能被忽略或捕获) SIGPIPE 向没有读者的管道写入数据 SIGSEGV 无效内存段访问 SIGQUIT 终端退出 3 SIGTERM 终止 SIGUSR1 用户定义信号1 SIGUSR2 用户定义信号2 SIGCHLD 子进程已经停止或退出 SIGCONT 如果被停止则继续执行 SIGSTOP 停止执行 SIGTSTP 终端停止信号 SIGTOUT 后台进程请求进行写操作 SIGTTIN 后台进程请求进行读操作 |
实验1: kill –l Man 7 signal 查看信号的默认动作、信号的含义 |
3信号处理
进程对信号的三种相应 q 不采取任何操作、有两个信号不能被忽略:SIGKILL(9号信号)和SIGSTOP。 思考1:为什么进程不能忽略SIGKILL、SIGSTOP信号。(如果应用程序可以忽略这2个信号,系统管理无法杀死、暂停进程,无法对系统进行管理。)。SIGKILL(9号信号)和SIGSTOP信号是不能被捕获的。 q 内核中断正在执行的代码,转去执行先前注册过的处理程序。 q 默认操作通常是终止进程,这取决于被发送的信号。 信号的默认操作:通过 man 7 |
man 7 signal |
编程实践:让应用程序捕捉ctrl+c信号 以ctrl+c 会产生一个中断。当前应用程序捕捉ctrl+c中断信号。 |
4信号signal函数编程实践
signal信号安装函数
signal函数,作用1:站在应用程序的角度,注册一个信号处理函数。 作用2:忽略信号、设置信号默认处理 信号的安装和恢复 q q q q q __sighandler_t q q q q SIG_IGN 屏蔽该信号 SIG_DFL 恢复默认行为 |
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include <unistd.h>
#include<errno.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <signal.h> /*
typedef void (*sighandler_t)(int); sighandler_t signal(int signum,
sighandler_t handler); */ int g_tag = ; __sighandler_t old;
// Linux内核调用这个函数 void myhandle(int num)
{
printf("recv signal id num : %d\n", num);
if ( == num)
{
g_tag = ;
// signal(SIGINT, SIG_DFL);
// signal(SIGINT, old);
}
return;
} int main(void)
{ // 信号的安装 old = signal(SIGINT, myhandle)
if ( signal(SIGINT, myhandle) == SIG_ERR )
{
perror("signal err");
return ;
} if ( signal(SIGQUIT, myhandle) == SIG_ERR )
{
perror("signal err");
return ;
} /*
无效的参数
if ( signal(SIGKILL, myhandle) == SIG_ERR )
{
perror("signal err");
return 0;
}
*/
while(g_tag); return ;
}
最新文章
- 快速创建一个springboot项目
- Emacs学习心得之 基础操作
- mysql连接报错 Host &lsquo;xxx&rsquo;is blocked because of many connection errors;unblock with 'mysqladmin flush-hosts'
- 转: rapidJSON与jsoncpp语法说明
- HTML 学习笔记 CSS(表格)
- IEnumerable、GetEnumerator、IEnumerator的理解
- Python面试题(二)
- python环境搭建
- jsPlumb
- hdu 1712 ACboy needs your help 分组背包
- 【转】DM8168添加DSP音频编解码算法--集成现有voice或audio codec
- ThinkPHP中ajax提交数据
- 【COCOS2DX-游戏开发之三三】TMX边界控制与小窗体内预览TMX
- JTextAreaDemo
- Measuring &; Optimizing I/O Performance
- 学习笔记:JavaScript-入门篇
- django drf 基础学习4
- 团队项目开发特点以及NABCD分析总结
- tomcat 部署时修改服务器时间
- SpringMvc-ModelAndView 结果出不来 显示路径问题 解决办法
热门文章
- CodeForces - 438D: The Child and Sequence(势能线段树)
- 隐藏select中的“请选择”项
- 【转】JVM虚拟性能分析
- snmpwalk用法
- Activiti:MalformedByteSequenceException: 3 字节的 UTF-8 序列的字节 3 无效。
- 蓝桥杯 算法训练 ALGO-126 水仙花
- 由于簇计数比预计的高,格式化操作无法完成——Allocation Unit Size Adjustments for Larger NTFS Volumes.
- Spring 自动注册及自动装配
- mongodb collection method
- 转:MongoDB &#183; 引擎特性 &#183; journal 与 oplog,究竟谁先写入?