++++++APUE读书笔记-10信号-02信号概念++++++
2、信号概念
================================================
(1)信号名称
每个信号都有一个名字,信号的名字都以SIG做为前缀。例如SIGABRT信号会在进程调用abort函数的时候产生。SIGALRM信号会在alarm函数设置的时间到期的时候产生,等等。每种系统所能够支持的信号的数目各不相同,有些还会额外增加一些应用程序自定义的信号,便于扩展等等。
信号的名称是用正整数常量(信号号)定义的,定义在头文件signal.h中。
实现上,实际是在另外一个头文件中定义每个信号的,但是这个头文件会被signal.h包含。内核包含一个用于用户程序层的头文件,是一个不好的习惯,所以,如果应用程序和内核同时需要一样的定义,那么信息会被放在一个内核的头文件中,然后被一个用户层的头文件包含。因此,FreeBSD 5.2.1和Mac OS X 10.3在头文件中定义了信号,Linux 2.4.22定义信号的地方是,Solaris 9定义的地方是.
没有哪个信号的信号号码是0,后面我们将会看到kill函数使用信号号码0用做特殊目的。POSIX.1把这个信号号称作空信号。
(2)产生信号
有许多可以产生信号的原因,
a)用户按下特定的终端按键产生信号。在终端按下DELETE按键(或者在许多系统中的Ctrl-c),会产生SIGINT信号,通过这种方法可以停止一个跑飞的程序。(后面我们会介绍一种方法,可以把这个信号映射成为任意的终端按键。)
b)硬件原因产生中断:除以0,非法内存引用,等等。这个原因经常会被硬件检测到,然后通知给内核,内核会产生特定的信号发送给这时候运行的进程。例如:SIGSEGV信号会在进程引用一个非法内存的时候产生。
c)kill函数可以允许一个进程发送任意信号给其他进程或者进程组。当然这是有所限制的,我们必须是被发送信号的进程的所有者或者是超级用户。
d)kill 命令允许我们给其它进程发送信号。这个程序只是kill函数的一个接口,经常用来终止运行在后台的跑飞的程序.
e)软件条件也可以产生信号,这种信号一般在发生一些特殊事情的时候产生,进程需要知道这些事情发生了。这些不是硬件原因产生的(例如除以0),但是却是软件原因产生的。例如,SIGURG信号(这个信号会在带外的数据到达网络连接的时候产生), SIGPIPE(当一个进程向管道中写入的时候,而管道的读取端的进程结束了,这时候会产生这个信号),SIGALRM(这个信号会在进程设置的定时器到期的时候产生)。
信号是一种典型的异步事件的例子,对于进程来说,信号可能会在任何时候发生,进程无法简单的判断一个信号是否发生了(例如通过一个变量来判断就不太可能),但是进程却需要告诉内核:"如果发生了某某信号,那么应该做什么什么"。
(3)信号处理
当产生一个信号的时候,我们可以通知内核来做如下的三件事情之一,我们把这些称作信号的disposition或者信号关联的action.
a.忽略信号。这个对于大多数信号是可以的,但是有两个信号一定不能被忽略:SIGKILL和SIGSTOP.这两个信号不能忽略的原因是为了给内核和超级用户提供一个可以肯定能够杀掉以及停止任何进程的手段。而且,如果我们忽略一些由于硬件错误产生的信号(例如除以0),进程的行为将会是不可预知的。
b.捕捉信号。为了做到这个,我们需要告诉内核在发生信号的时候,调用我们自己定义的一个函数。在我们的函数中,我们可以做我们想做的任何事情来处理产生信号的条件。例如,我们写一个命令解释器,当用户通过键盘输入中断信号的时候,会回到程序的主循环,并且结束用户运行的任何命令;如果一个SIGCHLD信号被捕捉了,这说明有一个子进程终止了,所以信号捕捉函数可以通过调用waitpid来捕获子进程的PID以及退出状态;另外再举一个例子,如果进程已经创建了临时文件,我们想要为SIGTERM信号写一个信号处理函数(termination信号是kill命令默认发送给进程的信号)来清除临时文件;我们一定要注意,SIGKILL和SIGSTOP这两个信号不能被捕捉。
c.使用默认的动作处理。
每一个信号有一个默认的动作,我们需要注意的是,大多数信号的默认行为就是终止程序。
下表中列出了所有信号的名字,哪个系统支持哪些信号,以及产生这些信号时系统默认的动作。
当上述发生信号时候的动作是"terminate+core"的时候,表示这个进程会在它的当前工作目录留下一份名字为"core"的文件,保存该进程的内存状态。这个文件可以被许多unix系统调试者使用,用来检查进程在退出的时候的状态。
UNIX系统信号
+------------------------------------------------------------------------------------------------------------------------------------+
| Name | Description |ISO C|SUS|FreeBSD 5.2.1|Linux 2.4.22|Mac OS X 10.3|Solaris 9| Default action |
|-----------+-------------------------------------+-----+---+-------------+------------+-------------+---------+---------------------|
| SIGABRT | abnormal termination (abort) | • | • | • | • | • | • |terminate+core |
|-----------+-------------------------------------+-----+---+-------------+------------+-------------+---------+---------------------|
| SIGALRM | timer expired (alarm) | | • | • | • | • | • |terminate |
|-----------+-------------------------------------+-----+---+-------------+------------+-------------+---------+---------------------|
| SIGBUS | hardware fault | | • | • | • | • | • |terminate+core |
|-----------+-------------------------------------+-----+---+-------------+------------+-------------+---------+---------------------|
| SIGCANCEL | threads library internal use | | | | | | • |ignore |
|-----------+-------------------------------------+-----+---+-------------+------------+-------------+---------+---------------------|
| SIGCHLD | change in status of child | | • | • | • | • | • |ignore |
|-----------+-------------------------------------+-----+---+-------------+------------+-------------+---------+---------------------|
| SIGCONT | continue stopped process | | • | • | • | • | • |continue/ignore |
|-----------+-------------------------------------+-----+---+-------------+------------+-------------+---------+---------------------|
| SIGEMT | hardware fault | | | • | • | • | • |terminate+core |
|-----------+-------------------------------------+-----+---+-------------+------------+-------------+---------+---------------------|
| SIGFPE | arithmetic exception | • | • | • | • | • | • |terminate+core |
|-----------+-------------------------------------+-----+---+-------------+------------+-------------+---------+---------------------|
| SIGFREEZE | checkpoint freeze | | | | | | • |ignore |
|-----------+-------------------------------------+-----+---+-------------+------------+-------------+---------+---------------------|
| SIGHUP | hangup | | • | • | • | • | • |terminate |
|-----------+-------------------------------------+-----+---+-------------+------------+-------------+---------+---------------------|
| SIGILL | illegal instruction | • | • | • | • | • | • |terminate+core |
|-----------+-------------------------------------+-----+---+-------------+------------+-------------+---------+---------------------|
| SIGINFO | status request from keyboard | | | • | | • | |ignore |
|-----------+-------------------------------------+-----+---+-------------+------------+-------------+---------+---------------------|
| SIGINT | terminal interrupt character | • | • | • | • | • | • |terminate |
|-----------+-------------------------------------+-----+---+-------------+------------+-------------+---------+---------------------|
| SIGIO | asynchronous I/O | | | • | • | • | • |terminate/ignore |
|-----------+-------------------------------------+-----+---+-------------+------------+-------------+---------+---------------------|
| SIGIOT | hardware fault | | | • | • | • | • |terminate+core |
|-----------+-------------------------------------+-----+---+-------------+------------+-------------+---------+---------------------|
| SIGKILL | termination | | • | • | • | • | • |terminate |
|-----------+-------------------------------------+-----+---+-------------+------------+-------------+---------+---------------------|
| SIGLWP | threads library internal use | | | | | | • |ignore |
|-----------+-------------------------------------+-----+---+-------------+------------+-------------+---------+---------------------|
| SIGPIPE | write to pipe with no readers | | • | • | • | • | • |terminate |
|-----------+-------------------------------------+-----+---+-------------+------------+-------------+---------+---------------------|
| SIGPOLL | pollable event (poll) | |XSI| | • | | • |terminate |
|-----------+-------------------------------------+-----+---+-------------+------------+-------------+---------+---------------------|
| SIGPROF | profiling time alarm (setitimer) | |XSI| • | • | • | • |terminate |
|-----------+-------------------------------------+-----+---+-------------+------------+-------------+---------+---------------------|
| SIGPWR | power fail/restart | | | | • | | • |terminate/ignore |
|-----------+-------------------------------------+-----+---+-------------+------------+-------------+---------+---------------------|
| SIGQUIT | terminal quit character | | • | • | • | • | • |terminate+core |
|-----------+-------------------------------------+-----+---+-------------+------------+-------------+---------+---------------------|
| SIGSEGV | invalid memory reference | • | • | • | • | • | • |terminate+core |
|-----------+-------------------------------------+-----+---+-------------+------------+-------------+---------+---------------------|
| SIGSTKFLT | coprocessor stack fault | | | | • | | |terminate |
|-----------+-------------------------------------+-----+---+-------------+------------+-------------+---------+---------------------|
| SIGSTOP | stop | | • | • | • | • | • |stop process |
|-----------+-------------------------------------+-----+---+-------------+------------+-------------+---------+---------------------|
| SIGSYS | invalid system call | |XSI| • | • | • | • |terminate+core |
|-----------+-------------------------------------+-----+---+-------------+------------+-------------+---------+---------------------|
| SIGTERM | termination | • | • | • | • | • | • |terminate |
|-----------+-------------------------------------+-----+---+-------------+------------+-------------+---------+---------------------|
| SIGTHAW | checkpoint thaw | | | | | | • |ignore |
|-----------+-------------------------------------+-----+---+-------------+------------+-------------+---------+---------------------|
| SIGTRAP | hardware fault | |XSI| • | • | • | • |terminate+core |
|-----------+-------------------------------------+-----+---+-------------+------------+-------------+---------+---------------------|
| SIGTSTP | terminal stop character | | • | • | • | • | • |stop process |
|-----------+-------------------------------------+-----+---+-------------+------------+-------------+---------+---------------------|
| SIGTTIN | background read from control tty | | • | • | • | • | • |stop process |
|-----------+-------------------------------------+-----+---+-------------+------------+-------------+---------+---------------------|
| SIGTTOU | background write to control tty | | • | • | • | • | • |stop process |
|-----------+-------------------------------------+-----+---+-------------+------------+-------------+---------+---------------------|
| SIGURG | urgent condition (sockets) | | • | • | • | • | • |ignore |
|-----------+-------------------------------------+-----+---+-------------+------------+-------------+---------+---------------------|
| SIGUSR1 | user-defined signal | | • | • | • | • | • |terminate |
|-----------+-------------------------------------+-----+---+-------------+------------+-------------+---------+---------------------|
| SIGUSR2 | user-defined signal | | • | • | • | • | • |terminate |
|-----------+-------------------------------------+-----+---+-------------+------------+-------------+---------+---------------------|
| SIGVTALRM | virtual time alarm (setitimer) | |XSI| • | • | • | • |terminate |
|-----------+-------------------------------------+-----+---+-------------+------------+-------------+---------+---------------------|
| SIGWAITING| threads library internal use | | | | | | • |ignore |
|-----------+-------------------------------------+-----+---+-------------+------------+-------------+---------+---------------------|
| SIGWINCH | terminal window size change | | | • | • | • | • |ignore |
|-----------+-------------------------------------+-----+---+-------------+------------+-------------+---------+---------------------|
| SIGXCPU | CPU limit exceeded (setrlimit) | |XSI| • | • | • | • |terminate+core/ignore|
|-----------+-------------------------------------+-----+---+-------------+------------+-------------+---------+---------------------|
| SIGXFSZ | file size limit exceeded (setrlimit)| |XSI| • | • | • | • |terminate+core/ignore|
|-----------+-------------------------------------+-----+---+-------------+------------+-------------+---------+---------------------|
| SIGXRES | resource control exceeded | | | | | | • |ignore |
+------------------------------------------------------------------------------------------------------------------------------------+
(4)core文件
core文件的生成是大多数unix系统的实现特性,尽管这个特性并不是POSIX.1的一部分,但是在Single UNIX Specification的XSI扩展中,它已经被指定,成为一个潜在的实现特性了。
core文件的名字在不同的实现中有所不同。在FreeBSD5.2.1中,core文件被命名为cmdname.core,这里,cmdname就是接收到信号的相应进程的命令名称;在Mac OS X10.3中,core文件被命名为core.pid,这里pid就是相应接受到信号的进程PID.这些系统允许通过sysctl命令的参数来配置生成的core文件的名称。
大多数实现都会把core文件保存在相应进程的当前工作目录;而MacOS X会把所有的core文件放在/cores中。
core文件在如下的情况中不会生成:(a)进程有set-user-ID并且当前用户不是程序文件的拥有者。(b)进程有set-group-ID并且当前用户不是当前文件的组主。(c)用户没有向当前工作目录写的权限。(d)文件已经存在,并且用户没有写这个文件的权限。(e)文件太大了(参考本书7.11章的RLIMIT_CORE限制)。
core文件(假设这个文件还没有存在)的权限一般是用户读写的,Mac OS X设置为用户只读。
上述表中信号的描述如果是"hardware fault"的,那么就相应于实现定义的硬件错误。所有这些名称都来自原来的PDP-11的unix系统实现。可以查阅一下你的系统的main手册,来确定具体这些信号和什么类型的错误相关。
参考资料还对表中所有的信号单独分别进行了描述,这里就不给出详细内容了,具体参考参考资料。
参考:
阅读(449) | 评论(1) | 转发(0) |