今天在阅读《linux内核彻底剖析-基于0.12内核》一书中信号(sigal.c)处理这一小节时发现本身原来对信号机制的理解并非很到位,经过查阅资料整理记录下来。 linux
几个概念:一个信号就是一个消息,它通知进程一个某种类型的事件已经在系统中发生了; 函数
用户在终端按下某些键,终端驱动程序会发送信号给前台进程;例如ctrl-c产生SIGINT信号;ctrl-\产生SIGQUIT信号;ctrl-z产生SIGSTP信号; 学习
硬件异常产生信号;这些信号由硬件检测到并通知内核,由内核通知当前进程,例如当前进程出现除0错误; 进程
kill系统调用,一个进程能够调用kill发送信号给另外一个进程; 事件
内核检测到某种软件设置的条件发生时也可能发信号给一个进程,例如alarm系统调用就会致使出现这样的场景; ip
2)阻塞信号、待处理信号:
阻塞信号指的是某个进程阻塞了某个或某些信号集;阻塞并非说进程不接收指定的信号集;而是指信号仍能够被进程接收(放入待处理信号集),可是不处理。从内核具体的实现能够很好的理解;
内核在task_struct中维护进程信号阻塞向量(block)和pending向量(待处理信号集);block与pending一一对应,对于某一个信号:若pending对应bit置位而block复位,标识信号已发生并接收且当前未被进程阻塞,能够马上处理(默认或用户自定义信号处理函数);若pending对应bit复位而block置位,标识信号还未被接收到,即便接收到了,那么也被当前进程阻塞(即不被马上处理,须要接触阻塞后才可处理)。。。 it
3)信号处理细微问题: 软件
4)可移植到信号处理程序
可移植信号语义为以下: 循环