一.关于信号和中断
1.信号机制别名软中断,在<signal.h>系统头文件中定义了一系列的信号编号,都对应着一个正整数量:
进程在用户空间运行时, 都要用信号机制来检查是否有信号到达, 而一般的进程默认对应信号的处理都是killed, 除非使用signal(信号编号, 处理方式)
函数来处理(所以别名软中断)。
2.“中断”是从I/O设备或协处理器发送到CPU的外部请求,它将CPU从正常执行转移到中断处理。“中断”一词可应用于任何“进程”,并不仅限于计算机中的CPU,例如:人员中段、进程中断、硬件中断、进程的陷阱错误导致自行中断等等
3.信号和中断的相似点:
(1)都采用了异步通信的方式.
同步就是排队, 信息一个接一个的处理, 异步就是插队
(2)都是暂停当前的, 去执行对应的handle程序
(3)都是处理完返回原来位置
(4)对于信号和中断, 都是可以屏蔽的
4.信号和中断的区别
(1)中断有优先级, 信号没有
(2)信号处理程序在用户态下运行的, 中断程序在核心态下运行的
(3)中断响应是及时的, 当信号响应一般有延迟
二.Uinx/Linux信号示例与信号处理
1.信号示例
(1)按“Ctrl+C”组合键通常会导致当前运行的进程终止。
(2)用户可使用nohup a.out & 命令在后台运行一个程序,即使在用户退出之后,进程仍将继续运行。nohup命令会使sh像往常一样复刻子进程来执行程序,但是子进程会忽略SIGHUP(1)信号。当用户退出时,sh会向与终端有关的所有进程发送一个SIGHUP信号。后台进程在接收到这一信号后,会忽略它继续运行。为防止后台进程使用终端进行I/O,后台进程通常会断开与终端的连接,使其完全不受任何面向终端信号的影响。
(3)也许几天之后,用户再次登录时会发现后台进程仍在运行,可以使用sh命令:
kill pid (or kill -s 9 pid)杀死该进程。
2.信号处理
(1)信号类型:Unix/Linux支持31种不同信号,每种信号在signal.h文件中都有定义
(2)信号来源
来自硬件中断的信号:
1)中断键(Ctrl+C):产生一个SIGINT(2)信号。
2)间隔定时器:当它的时间到期时,会产生一个SIGALRM(14)、SIGVTALRM(26)或SIGPROF(27)信号。
3)其他硬件错误,如总线错误、IO陷阱等。
来自异常的信号:当用户模式下的进程遇到异常时,会陷入内核模式,生成一个信号,并发送给自己。
来自其他进程的信号:进程可使用kill(pid,sig)系统调用向pid标识的目标进程发送信号。
三.信号处理步骤
1.当某进程处于内核模式时,会检查信号并处理未完成的信号
2.重置用户安装的信号捕捉函数:用户安装的陷阱相关信号捕捉函数用于处理用户代码中的陷阱错误。
3.信号和唤醒:在Unix/Linux内核中有两种SLEEP进程;深度休眠进程和浅度休眠进程。前一种进程不可中断,而后一种进程可由信号中断。
标签:中断,信号处理,用户,Unix,信号,Linux,进程 From: https://www.cnblogs.com/yao-yuer/p/16827640.html