unix高级编程10.pdf
《unix高级编程10.pdf》由会员分享,可在线阅读,更多相关《unix高级编程10.pdf(49页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、下载下载第1 0章信号10.1 引言信号是软件中断。很多比较重要的应用程序都需处理信号。信号提供了一种处理异步事件的方法:终端用户键入中断键,则会通过信号机构停止一个程序。U N I X的早期版本,就已经有信号机构,但是这些系统,例如 V 7所提供的信号模型并不可靠。信号可能被丢失,而且在执行临界区代码时,进程很难关闭所选择的信号。4.3 B S D和S V R 3对信号模型都作了更改,增加了可靠信号机制。但是这两种更改之间并不兼容。幸运的是P O S I X.1对可靠信号例程进行了标准化,这正是本章所说明的。本章先对信号机制进行综述,并说明每种信号的一般用法。然后分析早期实现的问题。在分析存
2、在的问题之后再说明解决这些问题的方法,这样有助于加深对改进机制的理解。本章也包含了很多并非1 0 0%正确的实例,这样做的目的是为了对其不足之处进行讨论。10.2 信号的概念首先,每个信号都有一个名字。这些名字都以三个字符 S I G开头。例如,S I G A B RT是夭折信号,当进程调用a b o r t函数时产生这种信号。S I G A L R M是闹钟信号,当由a l a r m函数设置的时间已经超过后产生此信号。V 7有1 5种不同的信号,S V R 4和4.3+B S D均有3 1种不同的信号。在头文件中,这些信号都被定义为正整数(信号编号)。没有一个信号其编号为0。在1 0.9节
3、中将会看到k i l l函数,对信号编号0有特殊的应用。P O S I X.1将此种信号编号值称为空信号。很多条件可以产生一个信号。当用户按某些终端键时,产生信号。在终端上按D E L E T E键通常产生中断信号(S I G I N T)。这是停止一个已失去控制程序的方法。(第11章将说明此信号可被映射为终端上的任一字符。)硬件异常产生信号:除数为0、无效的存储访问等等。这些条件通常由硬件检测到,并将其通知内核。然后内核为该条件发生时正在运行的进程产生适当的信号。例如,对执行一个无效存储访问的进程产生一个S I G S E G V。进程用k i l l(2)函数可将信号发送给另一个进程或进程
4、组。自然,有些限制:接收信号进程和发送信号进程的所有者必须相同,或发送信号进程的所有者必须是超级用户。用户可用k i l l(1)命令将信号发送给其他进程。此程序是 k i l l函数的界面。常用此命令终止一个失控的后台进程。当检测到某种软件条件已经发生,并将其通知有关进程时也产生信号。这里并不是指硬件产生条件(如被 0除),而是软件条件。例如 S I G U R G(在网络连接上传来非规定波特率的数据)、S I G P I P E(在管道的读进程已终止后一个进程写此管道),以及S I G A L R M(进程所设置的闹钟时间已经超时)。信号是异步事件的经典实例。产生信号的事件对进程而言是随机
5、出现的。进程不能只是测试一个变量(例如e r r n o)来判别是否发生了一个信号,而是必须告诉内核“在此信号发生时,请执行下列操作”。可以要求系统在某个信号出现时按照下列三种方式中的一种进行操作。(1)忽略此信号。大多数信号都可使用这种方式进行处理,但有两种信号却决不能被忽略。它们是:S I G K I L L和S I G S TO P。这两种信号不能被忽略的原因是:它们向超级用户提供一种使进程终止或停止的可靠方法。另外,如果忽略某些由硬件异常产生的信号(例如非法存储访问或除以0),则进程的行为是未定义的。(2)捕捉信号。为了做到这一点要通知内核在某种信号发生时,调用一个用户函数。在用户函数
6、中,可执行用户希望对这种事件进行的处理。例如,若编写一个命令解释器,当用户用键盘产生中断信号时,很可能希望返回到程序的主循环,终止系统正在为该用户执行的命令。如果捕捉到S I G C H L D信号,则表示子进程已经终止,所以此信号的捕捉函数可以调用 w a i t p i d以取得该子进程的进程I D以及它的终止状态。又例如,如果进程创建了临时文件,那么可能要为S I G T E R M信号编写一个信号捕捉函数以清除临时文件(k i l l命令传送的系统默认信号是终止信号)。(3)执行系统默认动作。表1 0-1给出了对每一种信号的系统默认动作。注意,对大多数信号的系统默认动作是终止该进程。表
7、1 0-1列出所有信号的名字,哪些系统支持此信号以及对于信号的系统默认动作。在P O S I X.1列中,表示要求此种信号。j o b表示这是作业控制信号(仅当支持作业控制时,才要求此种信号)。表10-1 UNIX信号名字说明ANSI C P O S I X.1S V R 44.3+B S D缺 省 动 作S I G A B R T异常终止(a b o r t)终止w/c o r eS I G A L R M超时(a l a r m)终止S I G B U S硬件故障终止w/c o r eS I G C H L D子进程状态改变作业忽略S I G C O N T使暂停进程继续作业继续/忽略S
8、I G E M T硬件故障终止w/c o r eS I G F P E算术异常终止w/c o r eS I G H U P连接断开终止S I G I L L非法硬件指令终止w/c o r eS I G I N F O键盘状态请求忽略S I G I N T终端中断符终止S I G I O异步I/O终止/忽略S I G I O T硬件故障终止w/c o r eS I G K I L L终止终止S I G P I P E写至无读进程的管道终止S I G P O L L可轮询事件(p o l l)终止S I G P R O F梗概时间超时(s e t i t i m e r)终止S I G P W R
9、电源失效/再起动忽略S I G Q U I T终端退出符终止w/c o r eS I G S E G V无效存储访问终止w/c o r eS I G S T O P停止作业暂停进程第1 0章信号1 9 9下载(续)名字说明ANSI C P O S I X.1S V R 44.3+B S D缺 省 动 作S I G S Y S无效系统调用终止w/c o r eS I G T E R M终止终止S I G T R A P硬件故障终止w/c o r eS I G T S T P终端挂起符作业停止进程S I G T T I N后台从控制t t y读作业停止进程S I G T T O U后台向控制t t
10、 y写作业停止进程S I G U R G紧急情况忽略S I G U S R 1用户定义信号终止S I G U S R 2用户定义信号终止S I G V T A L R M虚拟时间闹钟(s e t i t i m e r)终止S I G W I N C H终端窗口大小改变忽略S I G X C P U超过C P U限制(s e t r l i m i t)终止w/c o r eS I G X F S Z超过文件长度限制(s e t r l i m i t)终止w/c o r e在系统默认动作列,“终止w/c o r e”表示在进程当前工作目录的c o r e文件中复制了该进程的存储图像(该文件名
11、为c o r e,由此可以看出这种功能很久之前就是 U N I X功能的一部分)。大多数U N I X调试程序都使用c o r e文件以检查进程在终止时的状态。在下列条件下不产生 c o r e文件:(a)进程是设置-用户-I D,而且当前用户并非程序文件的所有者,或者(b)进程是设置-组-I D,而且当前用户并非该程序文件的组所有者,或者(c)用户没有写当前工作目录的许可权,或者(d)文件太大(回忆7.11节中的R L I M I T _ C O R E)。c o r e文件的许可权(假定该文件在此之前并不存在)通常是用户读写,组读和其他读。c o r e文件的产生不是P O S I X.1
12、所属部分,而是很多U N I X版本的实现特征。U N I X第6版没有检查条件(a)和(b),并且其源代码中包含如下说明:“如果你正在找寻保护信号,那么当设置-用户-I D命令执行时,将可能产生大量的这种信号”。4.3+B S D产生名为c o r e.p ro g的文件,其中p ro g是被执行的程序名的前 1 6个字符。它对c o r e文件给予了某种标识,所以是一种改进特征。表1 0-1“硬件故障”对应于实现定义的硬件故障。这些名字中有很多取自U N I X早先在P D P-11上的实现。请查看你所使用的系统的手册,以确切地确定这些信号对应于哪些错误类型。下面比较详细地说明这些信号。S
13、IGABRT 调用a b o r t函数时(见1 0.1 7节)产生此信号。进程异常终止。SIGALRM 超过用a l a r m函数设置的时间时产生此信号。详细情况见 1 0.1 0节。若由s e t i t i m e r(2)函数设置的间隔时间已经过时,那么也产生此信号。SIGBUS 指示一个实现定义的硬件故障。SIGCHLD 在一个进程终止或停止时,S I G C H L D信号被送给其父进程。按系统默认,将忽略此信号。如果父进程希望了解其子进程的这种状态改变,则应捕捉此信号。信号捕捉函数中通常要调用w a i t函数以取得子进程I D和其终止状态。2 0 0U N I X环境高级编程
14、下载系统V的早期版本有一个名为 S I G C L D(无H)的类似信号。这一信号具有非标准的语义,S V R 2的手册页警告在新的程序中尽量不要使用这种信号。应用程序应当使用标准的 S I G C H L D信号。1 0.7节将讨论这两个信号。SIGCONT 此作业控制信号送给需要继续运行的处于停止状态的进程。如果接收到此信号的进程处于停止状态,则系统默认动作是使该进程继续运行,否则默认动作是忽略此信号。例如,v i编辑程序在捕捉到此信号后,重新绘制终端屏幕。关于进一步的情况见 1 0.2 0节。SIGEMT 指示一个实现定义的硬件故障。E M T这一名字来自P D P-11的emulato
15、r trap 指令。SIGFPE 此信号表示一个算术运算异常,例如除以0,浮点溢出等。SIGHUP 如果终端界面检测到一个连接断开,则将此信号送给与该终端相关的控制进程(对话期首进程)。见图9-11,此信号被送给s e s s i o n结构中s _ l e a d e r字段所指向的进程。仅当终端的C L O C A L标志没有设置时,在上述条件下才产生此信号。(如果所连接的终端是本地的,才设置该终端的C L O C A L标志。它告诉终端驱动程序忽略所有调制解调器的状态行。第 11章将说明如何设置此标志。)注意,接到此信号的对话期首进程可能在后台,作为一个例子见图9-7。这区别于通常由终端
16、产生的信号(中断、退出和挂起),这些信号总是传递给前台进程组。如果对话期前进程终止,则也产生此信号。在这种情况,此信号送给前台进程组中的每一个进程。通常用此信号通知精灵进程(见第1 3章)以再读它们的配置文件。选用S I G H U P的理由是,因为一个精灵进程不会有一个控制终端,而且通常决不会接收到这种信号。SIGILL 此信号指示进程已执行一条非法硬件指令。4.3 B S D由a b o r t函数产生此信号。S I G A B RT现在被用于此。SIGINFO 这是一种4.3+B S D信号,当用户按状态键(一般采用C t r l-T)时,终端驱动程序产生此信号并送至前台进程组中的每一个
17、进程(见图 9-8)。此信号通常造成在终端上显示前台进程组中各进程的状态信息。SIGINT 当用户按中断键(一般采用D E L E T E或C t r l-C)时,终端驱动程序产生此信号并送至前台进程组中的每一个进程(见图9-8)。当一个进程在运行时失控,特别是它正在屏幕上产生大量不需要的输出时,常用此信号终止它。SIGIO 此信号指示一个异步I/O事件。在1 2.6.2节中将对此进行讨论。在表1 0-1中,对S I G I O的系统默认动作是终止或忽略。不幸的是,这依赖于系统。在S V R 4中,S I G I O与S I G P O L L相同,其默认动作是终止此进程。在 4.3+B S
18、D中(此信号起源于4.2 B S D),其默认动作是忽略。SIGIOT 这指示一个实现定义的硬件故障。I O T这个名字来自于P D P-11对于输入输出TRAP(input/output TRAP)指令的缩写。系统V的早期版本,由a b o r t函数产生此信号。S I G A B RT现在被用于此。SIGKILL 这是两个不能被捕捉或忽略信号中的一个。它向系统管理员提供了一种可以第1 0章信号2 0 1下载杀死任一进程的可靠方法。SIGPIPE 如果在读进程已终止时写管道,则产生此信号。1 4.2节将说明管道。当套接口的一端已经终止时,若进程写该套接口也产生此信号。SIGPOLL 这是一种
19、S V R 4信号,当在一个可轮询设备上发生一特定事件时产生此信号。1 2.5.2节将说明p o l l函数和此信号。它与4.3+B S D的S I G I O和S I G U R G信号接近。SIGPROF 当s e t i t i m e r(2)函数设置的梗概统计间隔时间已经超过时产生此信号。SIGPWR 这是一种S V R 4信号,它依赖于系统。它主要用于具有不间断电源(U P S)的系统上。如果电源失效,则U P S起作用,而且通常软件会接到通知。在这种情况下,系统依靠蓄电池电源继续运行,所以无须作任何处理。但是如果蓄电池也将不能支持工作,则软件通常会再次接到通知,此时,它在1 53
20、 0秒内使系统各部分都停止运行。此时应当传递S I G P W R信号。在大多数系统中使接到蓄电池电压过低的进程将信号S I G P W R发送给i n i t进程,然后由i n i t处理停机操作。很多系统V的i n i t实现在i n i t t a b文件中提供了两个记录项用于此种目的;p o w e r f a i l以及p o w e r w a i t。目前已能获得低价格的U P S系统,它用R S-2 3 2串行连接能够很容易地将蓄电池电压过低的条件通知系统,于是这种信号也就更加重要了。SIGQUIT 当用户在终端上按退出键(一般采用C t r l-)时,产生此信号,并送至前台进
21、程组中的所有进程(见图9-8)。此信号不仅终止前台进程组(如 S I G I N T所做的那样),同时产生一个c o r e文件。SIGSEGV 指示进程进行了一次无效的存储访问。名字S E G V表示“段违例(segmentation violation)”。SIGSTOP 这是一个作业控制信号,它停止一个进程。它类似于交互停止信号(S I G T S T P),但是S I G S TO P不能被捕捉或忽略。SIGSYS 指示一个无效的系统调用。由于某种未知原因,进程执行了一条系统调用指令,但其指示系统调用类型的参数却是无效的。SIGTERM 这是由k i l l(1)命令发送的系统默认终止
22、信号。SIGTRAP 指示一个实现定义的硬件故障。此信号名来自于P D P-11的T R A P指令。SIGTSTP 交互停止信号,当用户在终端上按挂起键(一般采用C t r l-Z)时,终端驱动程序产生此信号。SIGTTIN 当一个后台进程组进程试图读其控制终端时,终端驱动程序产生此信号。(见9.8节中对此问题的讨论。)在下列例外情形下不产生此信号,此时读操作返回出错,e r r n o设置为E I O:(a)读进程忽略或阻塞此信号,或(b)读进程所属的进程组是孤儿进程组。SIGTTOU 当一个后台进程组进程试图写其控制终端时产生此信号。(见9.8节对此问题的讨论。)与上面所述的S I G
23、T T I N信号不同,一个进程可以选择为允许后台进程写控制终端。第11章将讨论如何更改此选择项。如果不允许后台进程写,则与S I G T T I N相似也有两种特殊情况:(a)写进程忽略或阻塞此信2 0 2U N I X环境高级编程下载不幸的是,术语停止(s t o p)有不同的意义。在讨论作业控制和信号时我们需提及停止和继续作业。但是终端驱动程序一直用术语停止表示用C t r l-S和C t r l-Q字符停止和起动终端输出。因此,终端驱动程序将产生交互停止信号和字符称之为挂起字符而非停止字符。号,或(b)写进程所属进程组是孤儿进程组。在这两种情况下不产生此信号,写操作返回出错,e r r
24、 n o设置为E I O。不论是否允许后台进程写,某些除写以外的下列终端操作也能产生此信号:t c s e t a t t r,tcsendbreak,tcdrain,tcflush,tcflow 以及t c s e t p g r p。第11章将说明这些终端操作。SIGURG 此信号通知进程已经发生一个紧急情况。在网络连接上,接到非规定波特率的数据时,此信号可选择地产生。SIGUSR1 这是一个用户定义的信号,可用于应用程序。SIGUSR2 这是一个用户定义的信号,可用于应用程序。SIGVTALRM 当一个由s e t i t i m e r(2)函数设置的虚拟间隔时间已经超过时产生此信号。
25、SIGWINCH SVR4和4.3+B S D内核保持与每个终端或伪终端相关联的窗口的大小。一个进程可以用i o c t l函数(见11.1 2节)得到或设置窗口的大小。如果一个进程用 i o c t l的设置-窗口-大小命令更改了窗口大小,则内核将S I G W I N C H信号送至前台进程组。SIGXCPU SVR4和4.3+B S D支持资源限制的概念(见 7.11节)。如果进程超过了其软C P U时间限制,则产生此信号。SIGXFSZ 如果进程超过了其软文件长度限制(见 7.11节),则S V R 4和4.3+B S D产生此信号。10.3 signal函数U N I X信号机制最简
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- unix 高级 编程 10
限制150内