news 2026/9/24 2:43:27

学习笔记——IPC(进程间通信)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
学习笔记——IPC(进程间通信)

IPC(进程间通信)

一、为什么需要IPC?

  • 进程空间都是独立的(虚拟地址空间隔离)

  • 但进程之间有数据共享交换需求

  • 需要一种机制让进程间能够通信

二、IPC通信方式分类

1. 古老的通信方式

  • 无名管道(匿名管道)

  • 有名管道(FIFO)

  • 信号(Signal)

注意:管道是自动申请资源并继续运行程序

2. IPC对象通信(System V IPC)

  • 消息队列(用的相对少,不讨论)

  • 共享内存

  • 信号量集

主要用于:System V、BSD、SUSE、Fedora、kernel.org等系统

3. Socket通信

  • 主要用于网络通信

  • 也可用于本地进程间通信

三、管道底层实现

  • 底层数据结构:队列(先进先出)

  • 无名管道(Unnamed Pipe)=>pipe

    • 只能用于有亲缘关系的进程通信(如父子进程)

四、管道特性

1. 工作模式

  • 半双工工作模式

  • 实际编程中,通常当作单工使用

2. 文件特性

  • 所有管道都是特殊文件

  • 不支持定位操作

    • lseek→ 用于文件描述符

    • fseek→ 用于FILE*

  • 建议使用文件IOopen,read,write,close

  • 可选使用标准IO(带缓冲区):fgets,fread,fgetc

3. 编程顺序

创建管道 → fork → 读写管道 → 关闭管道

五、管道行为分析

1. 写端行为

读端存在,一直向管道写: - 超过64K(默认缓冲区大小)→ 写会阻塞 - 原因:写段写的太快

2. 读端行为

写端存在,从管道读: - 如果管道为空 → 读会阻塞 - 原因:读段读的太快

3. 管道破裂(Broken Pipe)

读端关闭,继续写管道: - 导致写段进程收到SIGPIPE信号 - 默认行为:进程退出

4. 管道结束

写端关闭,读管道: - 如果管道没有内容 → read返回0 - 表示:进程间通信结束

六、有名管道(FIFO)

1. 特点

  • 有名管道 =>fifo

  • 可以用于任意单机进程通信

  • 在文件系统中可见(有文件名称)

2. 编程步骤

创建有名管道 → 打开有名管道 → 读写管道 → 关闭管道 → 卸载有名管道

3. 特性

  • 具有无名管道所有特性

  • 额外特性

    • 如果有一端没有打开

    • open函数会阻塞直到另一端也打开

七、相关函数

1.pipe函数

int pipe(int pipefd[2]);
  • 功能:创建并打开一个无名管道

  • 参数

    • pipefd[0]→ 无名管道的固定读端

    • pipefd[1]→ 无名管道的固定写端

  • 返回值

    • 成功:0

    • 失败:-1

2.mkfifo函数

int mkfifo(const char *pathname, mode_t mode);
  • 功能:在指定路径下创建有名管道文件

  • 参数

    • pathname→ 要创建的有名管道路径+名称

    • mode→ 八进制文件权限(如0666)

  • 返回值

    • 成功:0

    • 失败:-1

八、使用场景对比

特性无名管道有名管道
关系要求必须有亲缘关系任意进程
文件可见性不可见文件系统可见
创建方式pipe()mkfifo()
打开阻塞不适用open会阻塞
生命周期随进程结束持久存在直到删除

九、注意事项

  1. 管道是半双工的,但通常按单工使用

  2. 管道不能定位,只能顺序读写

  3. 注意处理管道破裂(SIGPIPE信号)

  4. 读写阻塞是正常现象,需要合理设计程序逻辑

  5. 及时关闭不需要的文件描述符,避免资源泄漏

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/24 1:39:15

pgconf_asia_2017_logical_replication_us_20171204-1

Logical Replication Internals Agenda What is Logical Replication?Let’s try!ArchitectureRestrictionsTrouble shooting What is Logical Replication? What is Logical Replication? Is PostgreSQL 10 new featuresReplicate per tableReplicate per transaction…

作者头像 李华
网站建设 2026/9/22 19:34:16

leetcode 762. 二进制表示中质数个计算置位

Problem: 762. 二进制表示中质数个计算置位 解题过程 log2计算二进制长度,然后统计1个数,查看集合是否是素数,计算是否是素数,若是则放入集合 Code class Solution { public:int countPrimeSetBits(int left, int right) {int le…

作者头像 李华
网站建设 2026/9/23 16:34:34

为啥yyyy-MM-dd HH:mm:ss的MM和HH设计为大写

yyyy-MM-dd HH:mm:ss 中的大写 MM 和 HH 是 Java 日期格式化中的约定,原因如下: 1. 区分不同的时间单位(主要目的) 月份 (Month) vs 分钟 (Minute) // 大写的 M 表示月份 (Month) // 小写的 m 表示分钟 (minute)SimpleDateForm…

作者头像 李华
网站建设 2026/9/22 6:23:49

基于java的SpringBoot/SSM+Vue+uniapp的身体健康管理系统的详细设计和实现(源码+lw+部署文档+讲解等)

文章目录前言详细视频演示具体实现截图技术栈后端框架SpringBoot前端框架Vue持久层框架MyBaitsPlus系统测试系统测试目的系统功能测试系统测试结论为什么选择我代码参考数据库参考源码获取前言 🌞博主介绍:✌全网粉丝15W,CSDN特邀作者、211毕业、高级全…

作者头像 李华
网站建设 2026/9/23 18:38:50

走gateway接口偶现返回Internal Server Error

1.现象:业务反馈接口返回Internal Server Error经排查sringcloudgateway中有这个日志报错:18:49:40.317 [reactor-http-epoll-4] ERROR org.springframework.core.log.CompositeLog.error(CompositeLog.java:102) [traceId: ] - [009a73dc-74671082] 500…

作者头像 李华
网站建设 2026/9/23 8:40:10

35 岁以后的运维工程师该何去何从?出路究竟在何方?

运维工程师的出路在哪里,尤其是 35 岁以后? 最近在某乎看到个问题,“运维的出路在哪里,特别是35以后?”, 网友 1:孩子快跑 打好基础,网络,安全,数据库,服务…

作者头像 李华