首页 > 代码库 > APUE学习笔记——10 信号(一)——信号介绍

APUE学习笔记——10 信号(一)——信号介绍

信号的基本概念

    信号是软件中断,信号提供了解决异步时间的方法。
    每一中信号都有一个名字,信号名以SIG开头。

产生信号的几种方式

    很多条件可以产生信号:
    终端交互:用户按下某一些按键,如ctl+c,会产生信号。
    硬件异常:如除数为0,内存引用错误。
    kill(2)函数:将信号发送到一个进程或者进程组
    kill(1)命令:该命令为kill(2)函数的接口。用于终止失控的后台in成。
    检测到某软件条件发生:如网络连接上传来外数据(产生SIGURG信号),闹钟超时(产生SIGALRM信号)

处理信号的几种方式:

    忽略此信号:大部分信号可以忽略,但SIGKILL和SIGSTOP信号不能忽略。另,如果忽略硬件异常(如除数为0)信号,则运行结果未知。
    捕捉此信号:通知内核在某信号发生时,调用一个用户函数。SIGKILL和SIGSTOP信号不能被捕捉。如
    默认动作:执行系统默认动作,本文后面附带常见信号默认动作的表格。大部分信号的默认动作时终止进程

  SIGKILL和SIGSTOP信号既不能被忽略也不能被捕捉,因为这两个信号向内核或者超级用户提供了终止或停止信号的可靠方法。

信号列表:

    下面附上APUE Figure 10.1中信号列表的表格:
    在SUS列中,?表示该信号为POSIX.1的基础规范部分,XSI表示该信号为XSI拓展选项。
    在Default action列中,terminate+core表示进程存储映像被存放在当前目录的一个我们称之为core的文件中。core文件可以用于调试。关于不产生core文件的条件请参考http://blog.csdn.net/windeal3203/article/details/39289059



附上每一个信号的具体介绍:来源: <http://baike.baidu.com/view/64630.htm?fr=aladdin>
Signal
Description
SIGABRT
由调用abort函数产生,进程非正常退出
SIGALRM
用alarm函数设置的timer超时或setitimer函数设置的interval timer超时
SIGBUS
某种特定的硬件异常,通常由内存访问引起
SIGCANCEL
由Solaris Thread Library内部使用,通常不会使用
SIGCHLD
进程Terminate或Stop的时候,SIGCHLD会发送给它的父进程。缺省情况下该Signal会被忽略
SIGCONT
当被stop的进程恢复运行的时候,自动发送
SIGEMT
和实现相关的硬件异常
SIGFPE
数学相关的异常,如被0除,浮点溢出,等等
SIGFREEZE
Solaris专用,Hiberate或者Suspended时候发送
SIGHUP
发送给具有Terminal的Controlling Process,当terminal被disconnect时候发送
SIGILL
非法指令异常
SIGINFO
BSD signal。由Status Key产生,通常是CTRL+T。发送给所有Foreground Group的进程
SIGINT
由Interrupt Key产生,通常是CTRL+C或者DELETE。发送给所有ForeGround Group的进程
SIGIO
异步IO事件
SIGIOT
实现相关的硬件异常,一般对应SIGABRT
SIGKILL
无法处理和忽略。中止某个进程
SIGLWP
由Solaris Thread Libray内部使用
SIGPIPE
在reader中止之后写Pipe的时候发送
SIGPOLL
当某个事件发送给Pollable Device的时候发送
SIGPROF
Setitimer指定的Profiling Interval Timer所产生
SIGPWR
和系统相关。和UPS相关。
SIGQUIT
输入Quit Key的时候(CTRL+\)发送给所有Foreground Group的进程
SIGSEGV
非法内存访问
SIGSTKFLT
Linux专用,数学协处理器的栈异常
SIGSTOP
中止进程。无法处理和忽略。
SIGSYS
非法系统调用
SIGTERM
请求中止进程,kill命令缺省发送
SIGTHAW
Solaris专用,从Suspend恢复时候发送
SIGTRAP
实现相关的硬件异常。一般是调试异常
SIGTSTP
Suspend Key,一般是Ctrl+Z。发送给所有Foreground Group的进程
SIGTTIN
当Background Group的进程尝试读取Terminal的时候发送
SIGTTOU
当Background Group的进程尝试写Terminal的时候发送
SIGURG
当out-of-band data接收的时候可能发送
SIGUSR1
用户自定义signal 1
SIGUSR2
用户自定义signal 2
SIGVTALRM
setitimer函数设置的Virtual Interval Timer超时的时候
SIGWAITING
Solaris Thread Library内部实现专用
SIGWINCH
当Terminal的窗口大小改变的时候,发送给Foreground Group的所有进程
SIGXCPU
当CPU时间限制超时的时候
SIGXFSZ
进程超过文件大小限制
SIGXRES
Solaris专用,进程超过资源限制的时候发送
 












APUE学习笔记——10 信号(一)——信号介绍