1.9 信号
信号(signal)是通知进程已发生某种情况的一种技术。例如,若某一进程执行除法操作,其除数为0,则将名为SIGFPE(浮点异常)的信号发送给该进程。进程如何处理信号有三种选择。
(1) 忽略该信号。有些信号表示硬件异常,例如,除以0或访问进程地址空间以外的单元等,因为这些异常产生的后果不确定,所以不推荐使用这种处理方式。
(2) 按系统默认方式处理。对于除以0的情况,系统默认方式是终止该进程。
(3) 提供一个函数,信号发生时则调用该函数,这被称为捕捉该信号。使用这种方式,我们只要提供自编的函数就将能知道什么时候产生了信号,并按所希望的方式处理它。
很多情况会产生信号。终端键盘上有两种产生信号的方法,分别称为中断键(interrupt key,通常是Delete键或Ctrl+C)和退出键(quit key,通常是Ctrl+\),它们被用于中断当前运行的进程。另一种产生信号的方法是调用名为kill的函数。在一个进程中调用此函数就可向另一个进程发送一个信号。当然这样做也有些限制:当向一个进程发送信号时,我们必须是该进程的所有者或者是超级用户。
实例
回忆一下前面的简化shell程序(见程序清单1-5)。如果调用此程序,然后键入中断键,则执行此程序的进程终止。产生这种后果的原因是,对于此信号(SIGINT)的系统默认动作是终止进程。该进程没有告诉系统内核对此信号作何种处理,所以系统按默认方式终止该进程。
为使该程序能捕捉到此信号,它需要调用signal函数,由其指定当产生SIGINT信号时要调用的函数名。为此编写了名为sig_int的函数,当其被调用时,它只是打印一条消息,然后打印一个新提示符。在程序清单1-5中添加了11行,构成了程序清单1-8(添加的11行以行首的+ 号表示)。

因为大多数重要的应用程序都将使用信号,所以第10章将详细介绍信号。







