1基本概念

中断

q  中断是系统对于异步事件的响应

q  中断信号

q  中断源

q  现场信息

q  中断处理程序

q  中断向量表

异步事件的响应:进程执行代码的过程中可以随时被打断,然后去执行异常处理程序

生活中的中断和计算机系统中的中断

1)  无中断生活场景

张三看书,厨房烧水

2)有中断的生活场景

张三看书,设置闹钟,厨房烧水。

闹钟发出中断信号,张三把书合好(第20页),去厨房把开水事情处理好,张三重新打开20页进行阅读。

3)计算机系统的中断场景

中断源发出中断信号,CPU判断中断是否屏蔽屏蔽、保护现场 ,cpu执行中断处理程序, cpu恢复现场,继续原来的任务。
4)中断的其他概念

中断向量表保存了中断处理程序的入口地址。

中断个数固定,操作系统启动时初始化中断向量表。

中断有优先级(有人敲门,有人打电话,有优先级)

中断可以屏蔽(张三可以屏蔽电话)。

中断分类


硬件中断(外部中断)

外部中断是指由外部设备通过硬件请求的方式产生的中断,也称为硬件中断


软件中断(内部中断)

内部中断是由CPU运行程序错误或执行内部程序调用引起的一种中断,也称为软件中断。


x86平台INT指令 ARM软中断指令SWI

信号概念


信号是UNIX系统响应某些状况而产生的事件,进程在接收到信号时会采取相应的行动。


信号是因为某些错误条件而产生的,比如内存段冲突、浮点处理器错误或者非法指令等


信号是在软件层次上对中断的一种模拟,所以通常把它称为是软中断

信号和中断的区别


信号与中断的相似点:


(1)采用了相同的异步通信方式;


(2)当检测出有信号或中断请求时,都暂停正在执行的程序而转去执行相应的处理程序;


(3)都在处理完毕后返回到原来的断点;


(4)对信号或中断都可进行屏蔽。


信号与中断的区别:


(1)中断有优先级,而信号没有优先级,所有的信号都是平等的;


(2)信号处理程序是在用户态下运行的,而中断处理程序是在核心态下运行;


(3)中断响应是及时的,而信号响应通常都有较大的时间延迟。

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   
可以查看linux内核支持的信号

Man 7 signal 查看信号的默认动作、信号的含义

3信号处理

进程对信号的三种相应


忽略信号

不采取任何操作、有两个信号不能被忽略:SIGKILL(9号信号)和SIGSTOP。

思考1:为什么进程不能忽略SIGKILL、SIGSTOP信号。(如果应用程序可以忽略这2个信号,系统管理无法杀死、暂停进程,无法对系统进行管理。)。SIGKILL(9号信号)和SIGSTOP信号是不能被捕获的。


捕获并处理信号

内核中断正在执行的代码,转去执行先前注册过的处理程序。


执行默认操作

默认操作通常是终止进程,这取决于被发送的信号。

信号的默认操作:通过 man 7
signal 进程查看

man 7 signal

编程实践:让应用程序捕捉ctrl+c信号

以ctrl+c 会产生一个中断。当前应用程序捕捉ctrl+c中断信号。

4信号signal函数编程实践

signal信号安装函数

signal函数,作用1:站在应用程序的角度,注册一个信号处理函数。

作用2:忽略信号、设置信号默认处理  信号的安装和恢复


typedef
void (*__sighandler_t) (int);


#define
SIG_ERR ((__sighandler_t) -1)


#define
SIG_DFL ((__sighandler_t) 0)


#define
SIG_IGN ((__sighandler_t) 1)


函数原型:

         __sighandler_t
signal(int signum, __sighandler_t handler);


参数


signal是一个带signum和handler两个参数的函数,准备捕捉或屏蔽的信号由参数signum给出,接收到指定信号时将要调用的函数由handler给出


handler这个函数必须有一个int类型的参数(即接收到的信号代码),它本身的类型是void


handler也可以是下面两个特殊值:

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 ;
}

最新文章

  1. 快速创建一个springboot项目
  2. Emacs学习心得之 基础操作
  3. mysql连接报错 Host &lsquo;xxx&rsquo;is blocked because of many connection errors;unblock with 'mysqladmin flush-hosts'
  4. 转: rapidJSON与jsoncpp语法说明
  5. HTML 学习笔记 CSS(表格)
  6. IEnumerable、GetEnumerator、IEnumerator的理解
  7. Python面试题(二)
  8. python环境搭建
  9. jsPlumb
  10. hdu 1712 ACboy needs your help 分组背包
  11. 【转】DM8168添加DSP音频编解码算法--集成现有voice或audio codec
  12. ThinkPHP中ajax提交数据
  13. 【COCOS2DX-游戏开发之三三】TMX边界控制与小窗体内预览TMX
  14. JTextAreaDemo
  15. Measuring &amp; Optimizing I/O Performance
  16. 学习笔记:JavaScript-入门篇
  17. django drf 基础学习4
  18. 团队项目开发特点以及NABCD分析总结
  19. tomcat 部署时修改服务器时间
  20. SpringMvc-ModelAndView 结果出不来 显示路径问题 解决办法

热门文章

  1. CodeForces - 438D: The Child and Sequence(势能线段树)
  2. 隐藏select中的“请选择”项
  3. 【转】JVM虚拟性能分析
  4. snmpwalk用法
  5. Activiti:MalformedByteSequenceException: 3 字节的 UTF-8 序列的字节 3 无效。
  6. 蓝桥杯 算法训练 ALGO-126 水仙花
  7. 由于簇计数比预计的高,格式化操作无法完成——Allocation Unit Size Adjustments for Larger NTFS Volumes.
  8. Spring 自动注册及自动装配
  9. mongodb collection method
  10. 转:MongoDB &#183; 引擎特性 &#183; journal 与 oplog,究竟谁先写入?