在Linux系统中,信号(Signal)作为进程间异步通信的核心机制,如同精密齿轮般驱动着进程控制欲系统调度的运作,它通过软中断实现事件的快速响应,是理解进程行为与系统资源管理的关键切入点。

1、信号本质与分类
软中断属性:信号本质是内核或进程发送的软中断,用于通知进程特定事件(如硬件异常、用户指令、子进程状态变更)。
类型划分:标准信号(1-31)如SIGINT(Ctrl+C触发)、SIGTERM(终止进程),以及实时信号(34-64)支持排队机制,避免丢失。
不可靠信号:非实时信号可能因多次触发被覆盖,需通过sigaction()设置可靠处理。
2、信号处理机制
处理方式三选一:进程可指定自定义处理函数、忽略信号或执行默认动作(如SIGKILL强制终止,无法捕获)。
注册与发送:通过signal()/sigaction()注册处理函数,kill()系统调用或终端指令(如kill -9 PID)发送信号。
执行上下文:信号处理函数执行时,进程会中断当前操作;慢速系统调用(如sleep)可被信号打断,需注意竞态条件防护。
3、关键信号与系统调度
进程控制链:SIGSTOP暂停进程,SIGCONT恢复执行;SIGCHLD在子进程退出时通知父进程,避免僵尸进程堆积。
异常处理:SIGSEGV(非法内存访问)、SIGFPE(浮点异常)由硬件异常触发,内核将其转化为信号通知进程。
定时任务:alarm()设置SIGALRM定时信号,常用于周期性任务调度或超时控制。
4、信号设计注意事项
可靠性限制:相同信号的快速连续发送可能导致丢失,实时信号需优先用于关键场景。
阻塞与排队:通过sigprocmask()设置信号屏蔽字,控制信号递送时机;阻塞信号可排队等待处理。
并发安全:避免在信号处理函数中执行复杂操作(如内存分配),防止重入问题;使用原子变量或标志位传递状态。
本文凡亿教育原创文章,转载请注明来源!
暂无评论