常见信号含义
2017-12-21
信号的基本概念
软中断信号(signal, 又简称为信号),用来通知进程发生了异步事件。进程之间可以相互通过系统调用kill发送软终端信号。内核也可以因为内部事件而给进程发送信号,通知进程发送了某个事件。信号只是进程间通知发送了什么事件,并不给该进程传递任何数据。
收到信号的进程对各种信号有不同的处理方法。处理方法可以分为三类:第一种是类似中断的处理程序,对于需要处理的信号,进程可以指定处理函数,由该函数来处理。第二种方法是,忽略某个信号,对该信号不做任何处理,就像未发生过一样。第三种方法是,对该信号的处理保留系统的默认值,这种缺省操作,对大部分的信号的缺省操作是使进程终止。进程通过系统调用signal来指定进程对某个信号的处理能力。
在进程表的表象中有一个软中断信号,该域中每一位对应一个信号,当有信号发送给进程时,对应位置位。由此可以看出,进程对不同的信号可以同时保留,单对于同一个信号,进程并不知道在处理之前来过多少个。
常见的信号
- SIGINT
程序终止(interrupt)信号,在用户键入INTR字符(通常Ctrl+C)时发出。
- SIGQUIT
与SIGINT类似,但是由于QUIT字符(通常Ctrl-)来控制,进程因为受到SIGQUIT退出时会产生core文件,在这个意义上类似于这个程序错误。
- SIGILL
执行了非法指令。通常是因为可执行文件本身出现错误,或是试图执行数据段。堆栈溢出时也有可能产生这个信号。
-
SIGABRT 程序自己发现错误并调用abort时产生。
-
SIGBUS
非法地址,包括内存地址对齐(alignment)出错。例如:访问一个四个字长的整数,但其地址不是4的倍数。
- SIGKILL
用来立即结束程序的运行。本信号不能被阻塞、处理和忽略。
- SIGUSR1/SIGUSR2
留给用户使用。
- SIGSEGV
试图访问未分配给自己的内存,或试图往没有写权限的内存地址写数据。
- SIGPIPE
管道破裂。
- SIGALRM
时钟定时信号,计算的是实际的时间或时钟时间。alarm函数使用该信号。
- SIGTERM
程序结束(terminate)信号,与SIGKILL不同的是该信号可以被阻塞和处理。通常用来要求程序自己正常退出。Shell命令kill缺省产生这个信号。
- SIGCHLD
子进程结束时,父进程会收到这个信号。