信号分为可靠信号和不可靠信号(实时信号与非实时信号),主要区别在于信号的可靠性、排序和丢失情况。
Linux中标准信号(不可靠信号、非实时信号)的编号范围为1~31,这前面31个信号都有特殊的名字,有着相对应的特殊事件;Linux的信号机制是从UNIX系统中继承过来的,但是早期UNIX 系统中的信号机制比较简单和原始,后来逐渐暴露出来了一些问题,这些不可靠信号不支持排队(处理信号的时候又来了新的信号),可能会造成信号丢失;
定义于POSIX.1b中的实时信号(信号值为34~64的信号),用于弥补对标准信号的诸多限制;可靠信号并没有对应的名字,而是使用了SIGRTMIN+X和SIGRTMAX-X的方式来表示;可靠信号相对于不可靠信号有许多的优势:
⚫之前标准信号中可以让应用使用的信号只有两个,SIGUSR1和SIGUSR2,可靠信号扩大了用户应用程序自定义的范围;
⚫标准信号是非实时(不可靠)信号的原因是因为不排队,如果给进程发送多个相同的标准信号,信号也只传递一次,导致信号丢失;实时信号采用队列化管理,如果给一个进程发多个相同的实时信号,就会多次传递信号;要是多个实时信号处于等待状态,率先传递具有最小编号的信号(即信号编号越小,信号优先级越高),如果是同一类型的多个信号排队,那么信号的传递顺序和信号发送的顺序保持一致;并且发送实时信号的时候,还可以给信号指定伴随数据,给接收进程的信号处理器。
对于Linux中的标准信号,归纳相关表格用来查阅
默认处理列显示了信号的默认行为;core表示进程产生核心转储文件并退出;term表示信号终止进程;ignore表示忽略该信号;stop表示信号停止了进程;cont表示信号恢复一个停止的进程;
| 信号值 | 名称 | 描述 | 默认处理 |
| 1 | SIGHUP | 控制终端关闭 | term |
| 2 | SIGINT | 终止进程,一般是用户输入(CTRL+C)时发出 | term |
| 3 | SIGQUIT | 终端退出 | core |
| 4 | SIGILL | 检测到非法指令,如造成堆栈溢出时产生 | core |
| 5 | SIGTRAP | 跟踪/断电陷阱,由断点指令或其它trap指令产生 | core |
| 6 | SIGABRT | 异常终止,调用系统函数 abort()时产生。 | core |
| 7 | SIGBUS | 内存访问错误 | core |
| 8 | SIGFPE | 算术异常,出现致命算术错误时产生 | core |
| 9 | SIGKILL | 终止信号,该信号不能被阻塞、处理和忽略。 | term |
| 10 | SIGUSR1 | 用户自定义信号 | term |
| 11 | SIGSEGV | 无效的内存引用 | term |
| 12 | SIGUSR2 | 用户自定义信号 | term |
| 13 | SIGPIPE | 管道断开 | term |
| 14 | SIGALRM | 实时定时器过期 | term |
| 15 | SIGTERM | 终止进程,该信号可以被阻塞和处理 | term |
| 16 | SIGSTKFLT | 协处理器栈错误,Linux中该信号已经废弃 | term |
| 17 | SIGCHLD | 终止或停止子进程 | ignore |
| 18 | SIGCONT | 让处于进程停止状态的进程继续执行 | cont |
| 19 | SIGSTOP | 系统停止信号,停止进程,只是停止,进程未结束 | stop |
| 20 | SIGTSTP | 控制终端发起的停止信号,用于停止进程 | stop |
| 21 | SIGTTIN | 后台进程组向终端读取 | stop |
| 22 | SIGTTOU | 后台进程组向终端写 | stop |
| 23 | SIGURG | 套接字上产生紧急数据 | ignore |
| 24 | SIGXCPU | CPU占用时间超出限制 | core |
| 25 | SIGXFSZ | 文件大小超出限制 | core |
| 26 | SIGVTALRM | 虚拟定时器过期 | term |
| 27 | SIGPROF | 类似于SIGALRM,但包含CPU及系统调用时间 | term |
| 28 | SIGWINCH | 终端窗口尺寸发生变化 | ignore |
| 29 | SIGIO | 文件描述符就绪,可以产生I/O | term |
| 30 | SIGPWR | 上电启动失败 | term |
| 31 | SIGSYS | 非法的系统调用 | core |
204