Linux进程通信与信号处理全解析

张开发
2026/4/12 6:32:17 15 分钟阅读

分享文章

Linux进程通信与信号处理全解析
一、管道的基本特性1、管道是Linxu中最基础的进程间通信机制分为无名(匿名)管道和有名管道。 ​2、管道默认是半双工通信方式数据只能单向流动。 ​3、无名管道只能用于具有亲缘关系的进程间通信。​ 4、管道中的数据读取后会从管道中删除不支持随机访问。 ​5、默认情况下读端无数据时读进程阻塞写端管道满时写进程阻塞。​ 6、无名管道随进程的退出而消亡有名管道的文件持久存在于文件系统中需手动删除。 ​7、管道一旦创建成功会返回两个文件描述符读端对应fd[0]写端对应fd[1]。二、kill命令常用用法命令格式 功能说明 kill -l 查看系统所有的信号 kill -s SIGINT 3115 给PID为3115的进程发送SIGINT信号(使用的是信号名) kill -2 3124 给PID为3124的进程发送2号新号(使用的是信号的值) killall -s SIGINT a.out 给所有名为a.out的进程发送SIGINT信号 killall -2 a.out 给所有名为a.out的进程发送2号信号三、非实时信号1、1~31号为非实时信号也称为不可靠信号 ​2、每个信号都有对应的一个特定的系统事件 ​3、所有非实时信号的优先级是相同的 ​4、就绪队列中的非实时信号响应无固定顺序 ​5、就绪队列中的多个相同的非实时信号仅响应一次其余会被丢弃 ​6、非实时信号中的 SIGKILL 和 SIGSTOP 这两个信号无法被忽略、无法被捕捉、无法被阻塞只能按照缺省动作进行响应四 实时信号1、34~64号为实时信号也称为可靠信号 ​2、无具体对应的系统事件 ​3、实时信号优先级高于非实时信号实时信号的值越大优先级越高 ​4、就绪队列中的事实信号按优先级从高到低依次响应 ​5、就绪队列中的多个相同的实时信号全部都会被响应不会被丢弃 ​6、高优先级的信号会打断正在执行的低优先级信号 ​五、信号实现原理及过程1、信号本质是Linxu中异步进程间通信的一个机制用于通知进程发生了异步事件其无需进程主动轮询由内核触发处理。 ​2、信号由硬件(CtrlC触发)、软件(alarm定时器函数)或内核异常(段错误)产生。 ​3、信号生产之后内核将信号添加到目标进程的挂起队列(私有/共享)并将信号集对应的位置为1表示该信号处于挂起状态。 ​4、进程的信号集定义了当前阻塞的信号若信号被阻塞会留在挂起队列中直到阻塞解除。​ 5、内核在进程从内核态返回用户态时检查挂起队列中是否有未阻塞的信号如果有则取出信号根据注册的处理动作执行。​ 5.1 默认动作信号原本的缺省动作。 ​5.2 忽略动作进程显示设置了 SIG_IGN内核直接丢弃该信号(除SIGKILL 和 SIGSTOP)。 ​5.3 响应动作程序中通过signal等函数注册了信号及处理函数内核会在切换到用户态执行该注册的函数。

更多文章