1.信号机制
信号机制是一种使用信号来进行进程之间传递消息的方法,信号的全称为软中断信号,简称软中断。信号的本质是软件层次上对中断的一种模拟(软中断)。它是一种异步通信的处理机制,事实上,进程并不知道信号何时到来。
每个进程收到的所有信号,都是有内核负责产生和发送的,由内核处理。
信号时软层面上的“中断”。一旦信号产生,无论程序运行到什么位置,必须立即停止运行,处理信号,处理结束,在继续执行后续指令。
产生信号:
1.按键产生:如Ctrl+c,Ctrl+z
2.系统调用产生:如kill、raise、abort、可以给一个进程或进程组发送一个信号的进程或者进程组的所有者必须相同。
3.软件条件产生:如:定时器alarm
4.硬件异常产生
5.命令产生:如:用户调用kill命令将信号发送给其他进程
递达:递送并且到达进程,由内核处理掉
未决:产生和递达之间的状态。主要由于阻塞导致该状态
信号出路方式:
1.捕捉:对于需要小狐狸的信号,由用户的函数来处理
2.忽略:丢弃某个信号,对该信号不做任何处理
3.按系统的默认值处理:这种缺省操作大多数是的进程终止,进程通过系统调用signal函数来指定进程对某个信号的处理行为。
阻塞信号集(信号屏蔽字)
将某些信号加入集合,对他们设置屏蔽(对应位设置为1),当屏蔽x信号后,再疏导该信号,该信号属于未决信号集,知道接触屏蔽后才能处理。
未决信号集
1.动作:信号产生后,未决信号集中描述该信号的位立刻反转为1,表信号处于未决状态。当信号被吹里对应位翻转回为0.这一时刻往往非常短暂。
2.信号产生后由于某些原因(主要是阻塞)不能抵达。这类信号的集合称之为未决信号集,在屏蔽接触前,信号一直处于未决状态。
信号编号
在头文件<signal.h>中定义了64中信号,这些信号的名字都已SIG开头,且都被定义为正整数,称为信号编号。
查看左右信号===》使用命令:kill -l
不存在编号为0的信号。其中1-31号信号称之为常规信号(也叫普通信号或便准信号),34-64称之为实时信号,驱动编程与硬件相关。
普通信号:场景应用程序开法使用,信号独有默认处理动作
实时信号:场景底层驱动开发使用,信号处理可以有用户处理。
信号四要素
1.编号
2.名称
3.事件
4.默认处理动作
使用信号前:应先确认其四要素,在使用。
信号的产生
1.终端按键产生信号
ctrl+c-->2)SIGINT(终止/中断)
Ctrl+z-->20)SIGTSTP(暂停/停止)
Ctrl+\-->3)SIGQUIT(退出)
2.硬件异常产生信号
除0操作、非法访问内存、总线错误
3.kill函数、命令产生信号
kill命令产生信号:kill所要杀的进程pid
kill函数:给指定进程发送指定信号(不一定杀死)
int kill(pid_t pid, int sig)
返回值:成功:0 失败:-1(设置errno)
普通用户基本规则是:发送者实际或有效用户ID==接收者实际或有效用户ID
软件产生信号
alarm函数
设置定时器,再指定seconds后,内核会给当前进程发送14)SIGALRM信号。进程收到该信号,默认动作终止。
每个进程都有且只有唯一一个定时器。
常用:取消定时器alarm(0),返回就闹钟余下秒数。
定时,与进程状态无关(自然定时法)就绪、运行、挂起(阻塞、暂停)、终止、僵尸...无论进程处于何种状态alarm都计时。也称自然时间计时法。
setitime函数
设置定时器。可代替alarm函数。精度微秒us,可以实现周期定时。