day32

第一部分:进程间通信概述

进程间通信的常见方式

· 管道(无名管道、有名管道)

· 信号

· 消息队列

· 共享内存

· 信号灯(信号量)

第二部分:无名管道

  1. 无名管道的特点

· 只能用于具有亲缘关系的进程间通信(如父子进程)。

· 管道本质上是一段位于内核空间的缓存区,读写两端通过文件描述符操作。

  1. 创建函数 pipe

· 创建一段用于进程间通信的内核缓存区。

· 通过两个文件描述符操作管道:读端和写端。

· 成功返回0,失败返回-1。

  1. 管道的读写特性

有写端存在时:

· 管道中有数据:直接读出。

· 管道中无数据:读端阻塞等待,直到有数据写入。

无写端存在时:

· 管道中有数据:直接读出。

· 管道中无数据:读端立即结束,不阻塞等待。

有读端存在时:

· 管道未写满(容量约64K):直接写入。

· 管道已写满:写端阻塞,等待数据被读取后才能继续写入。

无读端存在时:

· 写入数据会产生管道破裂错误,导致进程直接退出。

第三部分:有名管道

  1. 有名管道的特点

· 可用于任意两个进程间通信(无论是否具有亲缘关系)。

· 通过文件系统中的管道文件来标识,进程通过路径名访问。

  1. 阻塞特性

· 读写两端必须同时打开才能继续执行。

· 若只有一端打开(只有读端或只有写端),则该端会阻塞等待,直到另一端加入。

  1. 创建函数 mkfifo

· 在文件系统中创建一个有名管道文件。

· 需指定管道文件的路径和访问权限。

· 成功返回0,失败返回-1。

第四部分:信号

  1. 信号的概念

信号是内核层与应用层之间通信的一种机制,用于通知进程发生了某种事件。

  1. 进程收到信号后的三种处理方式

· 缺省:按照系统默认方式处理信号(如终止进程、忽略等)。

· 忽略:不处理该信号,信号对进程无影响。

· 捕捉:按照用户指定的方式处理信号,即注册自定义信号处理函数。

  1. 常见信号种类

· SIGINT:中断信号(Ctrl+C)

· SIGQUIT:退出信号(Ctrl+\)

· SIGKILL:强制终止信号

· SIGTERM:终止信号

· SIGSTOP:暂停信号

· SIGSEGV:段错误信号

· SIGPIPE:管道破裂信号

· SIGALRM:定时器信号

· SIGCHLD:子进程状态变化信号

第五部分:关键概念辨析

无名管道 vs 有名管道

· 无名管道:仅限亲缘进程,无文件名,通过文件描述符操作。

· 有名管道:任意进程可用,有文件名,通过路径打开操作。

信号 vs 管道

· 信号:异步通信机制,用于通知事件,传输信息量极少。

· 管道:同步通信机制,用于传输数据流,信息量大。

写端存在性对读端的影响

· 写端存在时读端若无数据会阻塞等待。

· 写端不存在时读端若无数据则直接结束(读到文件末尾)。

读端存在性对写端的影响

· 读端存在且管道满时写端阻塞。

· 读端不存在时写端写入会触发管道破裂信号。

相关推荐
yi0115 小时前
LeetCode 219:存在重复元素 II——哈希表记录“最近一次出现的位置”
数据结构·人工智能·笔记·python·算法·leetcode·哈希表
_upupup6 小时前
Linux的调试工具——gdb/cgdb
linux·服务器
JeJe同学6 小时前
Docker镜像导入、容器启动
linux·运维·docker
志尊宝6 小时前
Vue3 零基础每日笔记(073):keep-alive 页面缓存实战——列表页返回不丢状态
vue.js·笔记·缓存·#vue #前端 #前端开发·#javascript·#vue.js
Jason_zhao_MR6 小时前
Linux与实时控制如何兼得
linux·嵌入式硬件·机器人·工业控制
闲云野鹤在人间7 小时前
MySQL|从理论、安装、备份到主从复制、MHA高可用详解
linux·运维·数据库·mysql·云计算
BSD_CGQ7 小时前
FSR传感器STM32 DMA高速采样工程实现(高精度、低CPU占用)
stm32·单片机·嵌入式硬件·压力传感器·源头工厂·柔性薄膜压力传感器·可变电阻压力传感器
Escalating_xu8 小时前
【C 语言】数据在内存中的存储:补码、大小端、整型陷阱与 IEEE 754 全解析
java·c语言·网络
weixin_448119948 小时前
Datawhale Easy Data × AI:笔记1 已重做,看新的笔记
笔记
一个风轻云淡8 小时前
GCC 和 GDB命令简单解读
java·linux·前端