欢迎来到天天文库
浏览记录
ID:34491283
大小:1.56 MB
页数:49页
时间:2019-03-06
《unix高级编程10new》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、下载下载第10章信号10.1引言信号是软件中断。很多比较重要的应用程序都需处理信号。信号提供了一种处理异步事件的方法:终端用户键入中断键,则会通过信号机构停止一个程序。UNIX的早期版本,就已经有信号机构,但是这些系统,例如V7所提供的信号模型并不可靠。信号可能被丢失,而且在执行临界区代码时,进程很难关闭所选择的信号。4.3BSD和SVR3对信号模型都作了更改,增加了可靠信号机制。但是这两种更改之间并不兼容。幸运的是POSIX.1对可靠信号例程进行了标准化,这正是本章所说明的。本章先对信号机制进行综述,并说明每种
2、信号的一般用法。然后分析早期实现的问题。在分析存在的问题之后再说明解决这些问题的方法,这样有助于加深对改进机制的理解。本章也包含了很多并非100%正确的实例,这样做的目的是为了对其不足之处进行讨论。10.2信号的概念首先,每个信号都有一个名字。这些名字都以三个字符SIG开头。例如,SIGABRT是夭折信号,当进程调用abort函数时产生这种信号。SIGALRM是闹钟信号,当由alarm函数设置的时间已经超过后产生此信号。V7有15种不同的信号,SVR4和4.3+BSD均有31种不同的信号。在头文件3、h>中,这些信号都被定义为正整数(信号编号)。没有一个信号其编号为0。在10.9节中将会看到kill函数,对信号编号0有特殊的应用。POSIX.1将此种信号编号值称为空信号。很多条件可以产生一个信号。¥当用户按某些终端键时,产生信号。在终端上按DELETE键通常产生中断信号(SIGINT)。这是停止一个已失去控制程序的方法。(第11章将说明此信号可被映射为终端上的任一字符。)¥硬件异常产生信号:除数为0、无效的存储访问等等。这些条件通常由硬件检测到,并将其通知内核。然后内核为该条件发生时正在运行的进程产生适当的信4、号。例如,对执行一个无效存储访问的进程产生一个SIGSEGV。¥进程用kill(2)函数可将信号发送给另一个进程或进程组。自然,有些限制:接收信号进程和发送信号进程的所有者必须相同,或发送信号进程的所有者必须是超级用户。¥用户可用kill(1)命令将信号发送给其他进程。此程序是kill函数的界面。常用此命令终止一个失控的后台进程。¥当检测到某种软件条件已经发生,并将其通知有关进程时也产生信号。这里并不是指硬件产生条件(如被0除),而是软件条件。例如SIGURG(在网络连接上传来非规定波特率的数据)、SIGPIPE5、(在管道的读进程已终止后一个进程写此管道),以及SIGALRM(进程所设置的闹钟时间已经超时)。信号是异步事件的经典实例。产生信号的事件对进程而言是随机出现的。进程不能只是测试一个变量(例如errno)来判别是否发生了一个信号,而是必须告诉内核“在此信号发生时,请第10章信号199下载执行下列操作”。可以要求系统在某个信号出现时按照下列三种方式中的一种进行操作。(1)忽略此信号。大多数信号都可使用这种方式进行处理,但有两种信号却决不能被忽略。它们是:SIGKILL和SIGSTOP。这两种信号不能被忽略的原因是:它6、们向超级用户提供一种使进程终止或停止的可靠方法。另外,如果忽略某些由硬件异常产生的信号(例如非法存储访问或除以0),则进程的行为是未定义的。(2)捕捉信号。为了做到这一点要通知内核在某种信号发生时,调用一个用户函数。在用户函数中,可执行用户希望对这种事件进行的处理。例如,若编写一个命令解释器,当用户用键盘产生中断信号时,很可能希望返回到程序的主循环,终止系统正在为该用户执行的命令。如果捕捉到SIGCHLD信号,则表示子进程已经终止,所以此信号的捕捉函数可以调用waitpid以取得该子进程的进程ID以及它的终止状态7、。又例如,如果进程创建了临时文件,那么可能要为SIGTERM信号编写一个信号捕捉函数以清除临时文件(kill命令传送的系统默认信号是终止信号)。(3)执行系统默认动作。表10-1给出了对每一种信号的系统默认动作。注意,对大多数信号的系统默认动作是终止该进程。表10-1列出所有信号的名字,哪些系统支持此信号以及对于信号的系统默认动作。在POSIX.1列中,表示要求此种信号。job表示这是作业控制信号(仅当支持作业控制时,才要求此种信号)。表10-1UNIX信号名字说明ANSICPOSIX.1SVR44.3+BSD缺8、省动作SIGABRT异常终止(abort)¥¥¥¥终止w/coreSIGALRM超时(alarm)¥¥¥终止SIGBUS硬件故障¥¥终止w/coreSIGCHLD子进程状态改变作业¥¥忽略SIGCONT使暂停进程继续作业¥¥继续/忽略SIGEMT硬件故障¥¥终止w/coreSIGFPE算术异常¥¥¥¥终止w/coreSIGHUP连接断开¥¥¥终止SIGILL非法硬件指令¥
3、h>中,这些信号都被定义为正整数(信号编号)。没有一个信号其编号为0。在10.9节中将会看到kill函数,对信号编号0有特殊的应用。POSIX.1将此种信号编号值称为空信号。很多条件可以产生一个信号。¥当用户按某些终端键时,产生信号。在终端上按DELETE键通常产生中断信号(SIGINT)。这是停止一个已失去控制程序的方法。(第11章将说明此信号可被映射为终端上的任一字符。)¥硬件异常产生信号:除数为0、无效的存储访问等等。这些条件通常由硬件检测到,并将其通知内核。然后内核为该条件发生时正在运行的进程产生适当的信
4、号。例如,对执行一个无效存储访问的进程产生一个SIGSEGV。¥进程用kill(2)函数可将信号发送给另一个进程或进程组。自然,有些限制:接收信号进程和发送信号进程的所有者必须相同,或发送信号进程的所有者必须是超级用户。¥用户可用kill(1)命令将信号发送给其他进程。此程序是kill函数的界面。常用此命令终止一个失控的后台进程。¥当检测到某种软件条件已经发生,并将其通知有关进程时也产生信号。这里并不是指硬件产生条件(如被0除),而是软件条件。例如SIGURG(在网络连接上传来非规定波特率的数据)、SIGPIPE
5、(在管道的读进程已终止后一个进程写此管道),以及SIGALRM(进程所设置的闹钟时间已经超时)。信号是异步事件的经典实例。产生信号的事件对进程而言是随机出现的。进程不能只是测试一个变量(例如errno)来判别是否发生了一个信号,而是必须告诉内核“在此信号发生时,请第10章信号199下载执行下列操作”。可以要求系统在某个信号出现时按照下列三种方式中的一种进行操作。(1)忽略此信号。大多数信号都可使用这种方式进行处理,但有两种信号却决不能被忽略。它们是:SIGKILL和SIGSTOP。这两种信号不能被忽略的原因是:它
6、们向超级用户提供一种使进程终止或停止的可靠方法。另外,如果忽略某些由硬件异常产生的信号(例如非法存储访问或除以0),则进程的行为是未定义的。(2)捕捉信号。为了做到这一点要通知内核在某种信号发生时,调用一个用户函数。在用户函数中,可执行用户希望对这种事件进行的处理。例如,若编写一个命令解释器,当用户用键盘产生中断信号时,很可能希望返回到程序的主循环,终止系统正在为该用户执行的命令。如果捕捉到SIGCHLD信号,则表示子进程已经终止,所以此信号的捕捉函数可以调用waitpid以取得该子进程的进程ID以及它的终止状态
7、。又例如,如果进程创建了临时文件,那么可能要为SIGTERM信号编写一个信号捕捉函数以清除临时文件(kill命令传送的系统默认信号是终止信号)。(3)执行系统默认动作。表10-1给出了对每一种信号的系统默认动作。注意,对大多数信号的系统默认动作是终止该进程。表10-1列出所有信号的名字,哪些系统支持此信号以及对于信号的系统默认动作。在POSIX.1列中,表示要求此种信号。job表示这是作业控制信号(仅当支持作业控制时,才要求此种信号)。表10-1UNIX信号名字说明ANSICPOSIX.1SVR44.3+BSD缺
8、省动作SIGABRT异常终止(abort)¥¥¥¥终止w/coreSIGALRM超时(alarm)¥¥¥终止SIGBUS硬件故障¥¥终止w/coreSIGCHLD子进程状态改变作业¥¥忽略SIGCONT使暂停进程继续作业¥¥继续/忽略SIGEMT硬件故障¥¥终止w/coreSIGFPE算术异常¥¥¥¥终止w/coreSIGHUP连接断开¥¥¥终止SIGILL非法硬件指令¥
此文档下载收益归作者所有