Linux Signal (1): 基本概念

时间:2022-02-18 14:57:27

      信号机制是进程之间相互传递消息的一种方法,信号全称为软中断信号,也有人称作软中断。从它的命名可以看出,它的实质和使用很象中断。所以,信号可以说是进程控制的一部分。

1. 信号又称软件中断:

信号提供了一种处理异步事件的方法. 每个信号都有一个名字, 他们以SIG开头, 如SIGALRM是闹钟信号, 当由alarm函数设置的计时器超时后产生此信号, 然后由SIGALRM的信号处理函数接管处理, 处理之后返回调用alarm函数的应用程序中.

     收到信号的进程对各种信号有不同的处理方法。处理方法可以分为三类:第一种是类似中断的处理程序,对于需要处理的信号,进程可以指定处理函数,由该函数来处 理。第二种方法是,忽略某个信号,对该信号不做任何处理,就象未发生过一样。第三种方法是,对该信号的处理保留系统的默认值,这种缺省操作,对大部分的信 号的缺省操作是使得进程终止。进程通过系统调用signal来指定进程对某个信号的处理行为。
2. 信号编号:

在头文件<signal.h>中, 信号都用宏定义为正整数的信号编号, 不存在编号为0的信号, kill函数对编号为0的信号有特殊的作用. POSIX.1将编号为0的信号定义为空信号, 如果kill中的signo参数为0, 则kill仍执行正常的错误检查, 但不发送信号. 这常被用来通过kill的返回值确定一个特定进程是否存在.
3. 不可忽略/捕捉的信号:

大多数信号都可以通过忽略进行处理, 但SIGKILL和SIGSTOP这两个信号不能被忽略. 因为它们是向超级用户提供使进程终止或停止的可靠方法. 另外, 如果忽略某些硬件异常产生的信号(例如非法内存引用或除0), 则进程的行为是未定义的.

4.信号的类型

        发出信号的原因很多,这里按发出信号的原因简单分类,以了解各种信号:

        (1) 与进程终止相关的信号。当进程退出,或者子进程终止时,发出这类信号。
        (2) 与进程例外事件相关的信号。如进程越界,或企图写一个只读的内存区域(如程序正文区),或执行一个特权指令及其他各种硬件错误。
        (3) 与在系统调用期间遇到不可恢复条件相关的信号。如执行系统调用exec时,原有资源已经释放,而目前系统资源又已经耗尽。
        (4) 与执行系统调用时遇到非预测错误条件相关的信号。如执行一个并不存在的系统调用。
        (5) 在用户态下的进程发出的信号。如进程调用系统调用kill向其他进程发送信号。
        (6) 与终端交互相关的信号。如用户关闭一个终端,或按下break键等情况。
        (7) 跟踪进程执行的信号。