api之信号
5、系统调用的中断和系统调用的重启(了解)
6、可再入与不可再入函数(了解)
7、kill函数和raise函数
8、alarm函数和pause函数
9、信号的发送、接收和处理的过程
10、信号集设置函数和sigprocmask函数
11、sigpending函数
12、sigaction函数
13、sigsuspend函数
14、abort函数
15、sleep函数
1、引言
信号是一种软件中断,与之相对应的就是硬件中断,区别是,软件中断是由软件代码触发的中断,而硬件中断是由硬件直接产生的电信号触发的中断,说到中断那么一定是异步的,所谓的异步就是中断信号的产生是随机的,对于中断信号的接受者来说,接受到中断信号的时刻自然也就是随机的。
当然与异步相对应的概念就是同步,所谓同步就是接收者知道在何时能够收到信号,当然本章所涉及的信号都是异步的,这里只是简单的解释一下什么是同步的概念。
2、信号
2.1、概念:所谓的信号就是通信内容受限制的一种异步的通信方式。
2.2、信号的命名方式
每个信号都有一个名字,这些名字都是以SIG开头(signal的缩写),如SIGABRT是夭折信号,当调用abort函数时会产生这个信号。当调用alarm函数时,由alarm设置的超时时间到后,会产生SIGALRM信号。
这些信号宏都被定义在了signal.h这些头文件中,每一个宏(正整数)代表一个信号,这里需要特别说明,没有编号为0(空信号)的信号,讲到kill函数时,0信号有特殊用途。
2.3、哪些情况下会产生信号
1)在终端按下按键时产生信号
例如按下crtl+c,会产生SIGINT信号,这个信号常常用于终止一个进程。实际上该信号可以被映射到终端上的任意一个字符(按键)上。
2)硬件异常产生信号
如除数为0,或者对内存无效的存储访问(段错误)等等,这些通常是由硬件先检测到并将其通知内核,然后内核会为该条件发生时正在运行的进程发送适当的信号,对于无效存储访问会产生一个SIGSEGV信号。
3)用户使用kill命令向其它的进程发送某个信号
kill命令是kill函数的命令形式,常用于向某进程发送信号。
4)当检测到某种软件条件已经发生,也会产生某个信号以通知某个进程。
例如:
a)、当网络上传来非固定波特率的数据时(如带外数据),产生SIGURG信号。
b)、写一个读端已经被关闭了的管道时,产生SIGPIPE信号。
c)、进程设置的闹钟超时(与alarm函数相关),产生SIGALRM信号。
2.4、信号的处理方式
在引言中我们已经说过,信号是异步通信机制,对于某个进程而言某个信号的产生是随机的,该进程必须告诉内核,当信号发生时需要按照什么样的方式处理。实际上处理信号的方式有如下三种:
1)忽略此信号
除了两种信号(SIGKILL和SIGSTOP)不能被忽略外,其它的的信号都可被忽略,这两个信号不能被忽略的原因是:它们提供一种终极的终止或停止进程的可靠方法,这是一种终极裁判权,如果这两个信号都被忽略了的话,某个进程跑飞后就没有办法终止或停止这个进程。
另外忽略某些硬件产生的信号被认为是不可取的,如我们如果忽略非法存储访问或除以0等硬件产生的信号的话,进程状态未定义的(无法确定的状态)。
2)捕获信号
如果某个进程被通知某个信号发生了,但是想要捕获这个信号的话,该进程就必须向内核注册一个捕获函数,当相应的信号发生时,捕获函数就会被调用并执行希望对这个事件的处理。
3)执行系统的默认操作
其实我们内核为每个信号在发生时都规定了一个默认的操作,如果我们不捕获也不忽略的话,当这个信号发生时,进程会按照默认方式去处理这些发生的信号,当然对于绝大多数信号而言,其默认的处理方式都是终止接收到该信号的进程或者忽略此信号。
2.5、内核定义的信号
1)、所有信号的清单
运行kill -l命令,显示所有的信号如下:
温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/61413.html