Linux信号signal处理机制.doc
文本预览下载声明
Linux?信号signal处理机制??????? 信号机制是进程之间相互传递消息的一种方法,信号全称为软中断信号,也有人称作软中断。从它的命名可以看出,它的实质和使用很象中断。所以,信号可以说是进程控制的一部分。
??????? 一、信号的基本概念
??????????? 1、基本概念
??????? 软中断信号(signal,又简称为信号)用来通知进程发生了异步事件。进程之间可以互相通过系统调用kill发送软中断信号。内核也可以因为内部事件而给进程发送信号,通知进程发生了某个事件。注意,信号只是用来通知某进程发生了什么事件,并不给该进程传递任何数据。
??????? 收 到信号的进程对各种信号有不同的处理方法。处理方法可以分为三类:第一种是类似中断的处理程序,对于需要处理的信号,进程可以指定处理函数,由该函数来处 理。第二种方法是,忽略某个信号,对该信号不做任何处理,就象未发生过一样。第三种方法是,对该信号的处理保留系统的默认值,这种缺省操作,对大部分的信 号的缺省操作是使得进程终止。进程通过系统调用signal来指定进程对某个信号的处理行为。
??????? 在进程表的表项中有一个软中断信号域,该域中每一位对应一个信号,当有信号发送给进程时,对应位置位。由此可以看出,进程对不同的信号可以同时保留,但对于同一个信号,进程并不知道在处理之前来过多少个。
??????? 2、信号的类型
??????? 发出信号的原因很多,这里按发出信号的原因简单分类,以了解各种信号:
??????? (1) 与进程终止相关的信号。当进程退出,或者子进程终止时,发出这类信号。??????? (2) 与进程例外事件相关的信号。如进程越界,或企图写一个只读的内存区域(如程序正文区),或执行一个特权指令及其他各种硬件错误。??????? (3) 与在系统调用期间遇到不可恢复条件相关的信号。如执行系统调用exec时,原有资源已经释放,而目前系统资源又已经耗尽。??????? (4) 与执行系统调用时遇到非预测错误条件相关的信号。如执行一个并不存在的系统调用。??????? (5) 在用户态下的进程发出的信号。如进程调用系统调用kill向其他进程发送信号。??????? (6) 与终端交互相关的信号。如用户关闭一个终端,或按下break键等情况。??????? (7) 跟踪进程执行的信号。
??????
???????
??????? 注意 信号SIGKILL和SIGSTOP既不能被捕捉,也不能被忽略。信号SIGIOT与SIGABRT是一个信号。可以看出,同一个信号在不同的系统中值可能不一样,所以建议最好使用为信号定义的名字,而不要直接使用信号的值。
、有关信号的系统调用
?????系统调用signal是进程用来设定某个信号的处理方法,系统调用kill是用来发送信号给指定进程的。这 两个调用可以形成信号的基本操作。后两个调用pause和alarm是通过信号实现的进程暂停和定时器,调用alarm是通过信号通知进程定时器到时。所 以在这里,我们还要介绍这两个调用。
??????? 1、signal 系统调用
??????? 系统调用signal用来设定某个信号的处理方法。该调用声明的格式如下:??????? void (*signal(int signum, void (*handler)(int)))(int);??????? 在使用该调用的进程中加入以下头文件:??????? #include signal.h
??????? 上述声明格式比较复杂,如果不清楚如何使用,也可以通过下面这种类型定义的格式来使用(POSIX的定义):??????? typedef void (*sighandler_t)(int);??????? sighandler_t signal(int signum, sighandler_t handler);??????? 但这种格式在不同的系统中有不同的类型定义,所以要使用这种格式,最好还是参考一下联机手册。
??????? 在调用中,参数signum指出要设置处理方法的信号。第二个参数handler是一个处理函数,或者是??????? SIG_IGN:忽略参数signum所指的信号。??????? SIG_DFL:恢复参数signum所指信号的处理方法为默认值。
??????? 传递给信号处理例程的整数参数是信号值,这样可以使得一个信号处理例程处理多个信号。系统调用signal返回值是指定信号signum前一次的处理例程或者错误时返回错误代码SIG_ERR。下面来看一个简单的例子:
??????? #include signal.h??????? #include unistd.h???????
显示全部