在Linux操作系统中,信号是一种进程间通信机制,用于通知进程某些事件的发生或请求进程执行特定的动作。信号分为两类:编号1至31的传统UNIX信号,被称为不可靠信号,以及编号32至63的扩展信号,即可靠信号(实时信号)。不可靠信号的特点在于无法排队处理,可能导致信号丢失,而可靠信号支持信号队列,确保信号能够被正确送达。
针对编号小于SIGRTMIN的传统不可靠信号,以下是部分重要信号的详细介绍:
SIGHUP(Hangup)
当用户终端连接断开时(无论是正常关闭还是异常中断),系统会向同一session内的所有作业发送此信号。这意味着当用户退出Linux登录时,属于该session的前台进程组和具有终端输出的后台进程都会接收到SIGHUP,预设行为是终止进程。然而,一些程序如wget可以捕获并忽略此信号,以便在用户登出后继续运行。此外,SIGHUP还可用于通知与终端分离的守护进程重新加载配置文件。
SIGINT(Interrupt)
作为程序终止信号,SIGINT通常由用户按下键盘组合Ctrl+C触发,旨在通知前台进程组结束其执行。
SIGQUIT(Quit)
与SIGINT类似,SIGQUIT通过键入QUIT字符(通常是Ctrl+/)引发,接收该信号的进程不仅会被终止,而且还会生成core文件,如同程序遇到严重错误时的情况。
SIGILL(Illegal instruction)
当进程执行非法指令时发出,这可能是由于可执行文件错误或尝试执行数据段,堆栈溢出也可能导致该信号。
SIGTRAP(Trap)
调试器使用的信号,通常由断点或其他陷阱指令生成。
SIGABRT(Aborted)
调用abort函数时产生的信号,标志着进程主动请求异常终止。
SIGBUS(Bus error)
因非法地址访问或内存地址对齐错误引发的信号,不同于SIGSEGV,后者源于对合法内存区域的非法访问。
SIGFPE(Floating point exception)
在发生严重的算术运算错误时发出,包括但不限于浮点运算错误、溢出以及除数为零等情况。
SIGKILL(Killed)
这是一个强制终结进程的信号,无法被阻止、处理或忽略,常用于在常规手段无法终止进程时强行结束其运行。
SIGUSR1 & SIGUSR2(User signal 1 & 2)
这两者均为预留信号,供用户自定义功能。
SIGSEGV(Segmentation fault)
进程试图访问未分配给它的内存,或是尝试向无权限的内存地址写入数据时产生的信号。
SIGPIPE(Broken pipe)
当进程尝试向已关闭的管道或套接字写入数据时,会接收到此信号,表明管道已破裂。
SIGALRM(Alarm clock)
定时信号,与实际或时钟时间相关联,由alarm函数设置和使用。
SIGTERM(Terminated)
程序终止信号,相较于SIGKILL,SIGTERM允许被阻塞和处理。它是系统或用户请求进程正常退出的标准方式,kill命令默认发送的就是这个信号。
SIGCHLD(Child exited)
当子进程终止时,父进程会收到此信号。若父进程未恰当处理此信号,子进程虽已终止但仍可能存在于内核进程表中,成为所谓的僵尸进程。应通过忽略、捕获或wait子进程等方式避免这种情况。
SIGCONT(Continue)
用于恢复已停止(stopped)进程的执行,此信号不可被阻塞。
SIGSTOP & SIGTSTP
两者分别用于立即无条件停止进程执行(不可被捕获、忽略或阻塞)和以可控制方式停止进程(可以被捕获或忽略)。SIGTSTP通常由用户按下Ctrl+Z触发。
其余信号如SIGTTIN、SIGTTOU、SIGURG、SIGXCPU、SIGXFSZ、SIGVTALRM、SIGPROF、SIGWINCH、SIGIO、SIGPWR、SIGSYS各自对应着不同类型的事件,如终端交互、资源限制超限、窗口大小变化、异步I/O就绪等。
值得注意的是,其中有几种特殊信号的行为不可更改或具有特别的效果:
- 不可被捕获、阻塞或忽略的信号包括SIGKILL和SIGSTOP;
- 不可恢复至默认动作的信号有SIGILL、SIGTRAP等;
- 默认会导致进程异常终止(abort或core dump)的信号包括SIGABRT、SIGBUS、SIGFPE等;
- 默认会导致进程正常退出的信号有SIGALRM、SIGHUP、SIGINT等;
- 默认会导致进程停止(而非终止)的信号有SIGSTOP、SIGTSTP等;
- 默认被进程忽略的信号有SIGCHLD、SIGURG、SIGWINCH等。
最后,不同系统对某些信号的默认处理可能有所不同,如SIGIO在SVR4和4.3BSD系统中的表现就有差异。
粉丝福利, 免费领取C/C++ 开发学习资料包、技术视频/项目代码,1000道大厂面试题,内容包括(C++基础,网络编程,数据库,中间件,后端开发/音视频开发/Qt开发/游戏开发/Linuxn内核等进阶学习资料和最佳学习路线)↓↓↓↓↓↓见下面↓↓文章底部点击免费领取↓↓