标准信号(signal.h)

来源:互联网 发布:ai软件如何画图 编辑:程序博客网 时间:2024/05/15 20:34

int NSIG        已定义的信号的数目,为最后一个信号的值加一。 
  
1.程序错误信号:程序无法再继续运行下去,这类信号的缺省动作是终止程序,此 
时信号 
处理函数应该做一些善后工作,如先前关掉了击键回显(stty -echo),此时应打开 
击键 
回显(stty echo),最后将缺省动作指定为处理函数,然后重新触发这个信号以结束 
程序。 
int SIGFPE      floating-point exception,包括除零、溢出。当一个程序在一个 
         被用来做浮点操作的地方存了一个整数,这通常会引发"invalid operation" 
         异常,因为处理器不能把这个数据识别为浮点数。 
                 IEEE Standard for Binary Floating-Point Arithmetic(ANSI/IEEE 
         Std 754-1985 and ANSI/IEEE Std 854-1987)定义了各种浮点异常,并要求 
         计算机系统报告。但是这个标准没有规定如何报告,也没有规定操作系统 
         能提供给程序员什么样的处理和控制。 
                 BSD系统提供的SIGFPE处理程序有一个额外的参数以分清引起这个 
         异常的原因,这意味着你写的处理函数要接受两个参数,但设置为该信号 
         的处理函数时要转型到(cast)单参数函数。额外参数取值为: 
         FPE_INTOVF_TRAP Integer overflow (impossible in a C program  
                         unless you enable overflow trapping in a  
                         hardware-specific fashion).  
         FPE_INTDIV_TRAP Integer division by zero.  
         FPE_SUBRNG_TRAP Subscript-range (something that C programs never 
                         check for).  
         FPE_FLTOVF_TRAP Floating overflow trap. 
         FPE_FLTDIV_TRAP Floating/decimal division by zero. 
         FPE_FLTUND_TRAP Floating underflow trap. (Trapping on floating  
underflow 
                         is not normally enabled.)  
         FPE_DECOVF_TRAP Decimal overflow trap. (Only a few machines have  
decimal 
                         arithmetic and C never uses it.)  
  
int SIGILL      illegal instruction, 当可执行文件损坏或试图执行数据。后者常发 
生在 
                 传递了一个无效的函数指针、写自动数组(在stack里建立的数组)时超越上限 
                 (或通过指针写自动变量)损坏了堆栈里的其他数据如一个堆栈帧的返回地址 
                 等情况下。 
                         当堆栈溢出、或者系统在执行一个信号的处理函数时出错,这时也会 
                 引发SIGILL. 
  
int SIGSEGV     segmentation violation, 读写非本进程的内存区,或写只读内存区 
 
                 反引用空指针或未初始化指针,或在遍历数组时判断数组结尾失误。在反引用 
                 空指针时有的系统会触发SIGBUS。 
  
int SIGBUS      bus error,反引用无效指针,与SIGSEGV类似,但SIGSEGV表明的是对 
有效内存 
                 的无效访问,SIGBUS表明的是对无效地址的访问。特别的是,SIGBUS常发生在 
                 反引用一个没对齐的指针(misaligned pointer),例如在一个不能被四整除的 
                 地址处指向一个四字的整数(four-word integer). 
                  
int SIGABRT     abort, 表明程序自己探测到一个错误并且调用了abort函数。 
  
int SIGIOT      由PDP-11 "IOT"指令产生,在大部分机器上,此仅为SIGABRT的别名。 
  
  
int SIGTRAP     由机器的断点指令和其它的陷阱指令,此信号用于调试器。 
  
int SIGEMT      Emulator trap,当系统以软件方式模拟某个未实现的指令或系统模拟 
  
                 未实现指令时失败。 
  
int SIGSYS      bad system call,非法的系统调用代码号。(系统中断号?) 
  
2.终止信号: 进程被通知要终止,此时利用此信号的处理函数可以作一些善后工作 
,处理 
         函数的编写类似于上一类信号。缺省动作是终止进程。 
int SIGTERM     termination,是要求程序终止的通用的、有礼貌的、通常的方式。 
此信号 
         可以被阻塞(blocked)、处理(handled)、忽略(ignored)。Shell的kill命 
 
  
         缺省用的是此信号。 
  
int SIGINT      program interrupt, 用户打了INTR字符(通常为C-c)时发出。 
  
int SIGQUIT     类似于SIGINT,除了他被QUIT字符(通常为C-\)控制并且在终止进 
程时 
                 产生一个core dump。通常这被认为用户发现了一个程序错误,因此在此信号 
                 的处理函数中最好不要删除临时文件以供用户调试。 
  
int SIGKILL     使程序立刻终止。此信号不能被阻塞、处理或忽略,因此他总是不可 
恢复的。 
                 这个信号通常都是显示被请求的,程序应该在其他办法如SIGTERM都无反映时才 
 
                 此信号。 
int SIGHUP      hang-up, 这个信号用来报告用户的终端断开了连接(see Control  
Modes)。也用来 
                 报告一个终端上的与其会话(session)联系的作业的控制进程的结束,这会将这 
 
                 会话中的所有进程与控制终端断开(see Termination Internals)。 
  
3.警报信号(Alarm Signals): 此信号表明计时器的过期(see Setting an Alarm) 
。缺省动作是终止 
                 程序。通常都要提供自己的有用的处理函数。 
int SIGALRM     表明一个测量真实或时钟时间的计时器的过期。例如此信号被alarm 
函数使用。 
  
int SIGVTALRM   virtual time alarm,表明一个测量当前进程使用的CPU时间的计 
时器过期。 
  
int SIGPROF     profiling, 表明一个测量当前进程使用的CPU时间和系统在此进程期 
间花的时间 
                 的计时器过期。常用于实现代码的性能剖析。 
  
4.异步I/O信号:用于与异步I/O接口协作。必须调用fcntl函数来使一个特定的文 
件描述符可以产生 
                 此种信号。缺省动作是忽略它们。 
int SIGIO       当一个文件描述符准备作输入或输出时发送此行号。在大多数系统上只 
有终端 
                 (Terminals)和Sockets可以产生此信号。 
  
int SIGURG      This signal is sent when "urgent" or out-of-band data arrives 
  on a socket. 
                 See Out-of-Band Data.  
  
int SIGPOLL     This is a System V signal name, more or less similar to  
SIGIO. It is defined 
                 only for compatibility.  
  
5.作业控制信号:用来支持作业控制(job control),但需要系统支持作业控制, 
否则这些信号不会 
                 被触发或处理。通常应该放任这些信号除非你懂得作业控制如何运作。see  
Job Control. 
int SIGCHLD     当一个进程的子进程中的任意一个终止(terminate)或停止(stop)时 
此信号被发送给 
                 此父进程。缺省动作是忽略。 
  
int SIGCLD      SIGCHLD的废弃了的名字。 
  
int SIGCONT     使一个进程继续。缺省动作是忽略。不可被阻塞。 
  
int SIGSTOP     停止进程。不可以被处理、忽略或阻塞。 
  
int SIGTSTP     交互的(interactive)的stop信号。可以被处理和忽略。比如在一个 
关闭了击键回显 
                 的程序里,它应该处理此信号以在停止前打开击键回显。此信号常被SUSP字符( 
通常 
                 为C-z)触发。 
  
int SIGTTIN     一个运行中的后台作业尝试从用户的终端读取时会收到此信号。缺省 
动作是停止运行。 
                 see Access to the Terminal. 
  
int SIGTTOU     一个运行中的后台作业尝试写用户的终端或设置用户的终端时会收到 
此信号。 
                 缺省动作是停止运行。see Output Modes 
  
         当一个进程停止时,除了SIGKILL、SIGCONT外其它消息都不能发送给他,这些信 
号被标记为 
未决的(pending),直到进程继续运行时才发送给他。给一个进程发送SIGCONT会使 
得此进程的未决的 
STOP信号被丢弃。另一方面,给一个进程发送STOP信号会使得此进程的未决的 
SIGCONT信号被丢弃。 
  
6.操作错误信号:用来报告程序的一个操作引起的各种错误。缺省动作是终止程序 
 
int SIGPIPE     broken pipe。 
int SIGLOST     resource lost。 
int SIGXCPU     CPU time limit exceeded。see Limits on Resources。 
int SIGXFSZ     File size limit exceeded。see Limits on Resources。 
  
7.其它信号 
int SIGUSR1 
int SIGUSR2     这两个信号提供给用户定义。常用于简单的进程见通信。缺省动作是 
终止进程。 
  
int SIGWINCH    window size change,在某些系统上当终端的行宽和列宽改变时会 
触发此信号。 
                 缺省是忽略。 
  
int SIGINFO     Information request. In 4.4 BSD and the GNU system, this  
signal is sent 
  
                 to all the processes in the foreground process group of the  
controlling 
                 terminal when the user types the STATUS character in canonical mode;  
see 
                 Signal Characters.  
                 If the process is the leader of the process group, the default  
action is 
                 to print some status information about the system and what the process 
  is 
                 doing. Otherwise the default is to do nothing.  
  
  
8.信号消息 
char* strsignal(int signum)     <string.h>      GNU extension 
返回一个静态分配的描述此信号的字符串。不应该修改返回的串。 
  
  
void psignal(int signum, const char* message)   <signal.h>      BSD feature 
当message为空指针或为空串时只打印对应signum的消息和一个新行符,若非空, 
则打印message, 
再打印": ",接着是对应signum的消息。 
  
在BSD系统上有个数组sys_siglist,里面包含了对应各种信号的消息。