Linux信号机制:进程间高效传递事件与操控指令的桥梁

本文详细介绍了Linux系统中的信号机制,包括传统不可靠信号和扩展可靠信号的区别,以及多个重要信号的作用、触发条件和默认行为。还探讨了不同信号的特性和在程序中的应用场景,以及不可变信号和默认处理的特性。
摘要由CSDN通过智能技术生成

在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内核等进阶学习资料和最佳学习路线)↓↓↓↓↓↓见下面↓↓文章底部点击免费领取↓↓

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值