news 2026/7/14 22:43:43

Linux系统编程——IPC进程间通信

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Linux系统编程——IPC进程间通信

目录

一、Linux IPC 的核心种类

1.古老的通信方式

2.IPC 对象通信(system v 标准)

3.socket 通信

二、无名管道(匿名管道)

1. 核心特性

2.读写行为规则

3.编程顺序

4.核心函数:pipe

5.示例代码:父子进程通过无名管道通信

三、有名管道

1.核心特性

2.编程顺序

3.核心函数:mkfifo

4.示例代码:两个无亲缘进程通过 FIFO 通信

四、无名管道与有名管道核心对比

五、总结


一、Linux IPC 的核心种类

1.古老的通信方式

是 Linux 早期的基础 IPC 实现,包括:

  • 无名管道
  • 有名管道
  • 信号

2.IPC 对象通信(system v 标准)

基于内核对象的通信方式,常用的有:

  • 消息队列(使用相对较少,这里不讨论)
  • 共享内存
  • 信号量集

3.socket 通信

支持跨主机的网络级通信,核心场景是:

  • 网络通信

注:管道的底层实现是队列,数据遵循 “先进先出” 规则。

二、无名管道(匿名管道)

无名管道对应 pipe,是仅支持亲缘关系进程(如父子、兄弟进程)通信的方式。

1. 核心特性

  • 仅能给亲缘关系进程通信;
  • 半双工工作模式(实际编程按单工使用);
  • 是特殊文件,不支持定位操作(lseek 对管道文件描述符 / 文件指针无效);
  • 依赖文件 IO / 标准 IO 操作。

2.读写行为规则

管道的读写逻辑受缓冲区(默认 64K)和两端状态影响:

  1. 读端存在时,写端持续写超 64K 会阻塞(写得太快);
  2. 写端存在时,读端读空管道会阻塞(读得太快);
  3. 读端关闭后,写端写管道会导致写进程崩溃(管道破裂);
  4. 写端关闭后,读端读完管道内容,read 会返回 0,标志进程间通信结束。

3.编程顺序

创建管道 → fork子进程 → 读写管道 → 关闭管道

4.核心函数:pipe

int pipe(int pipefd[2]);
  • 功能:创建并打开一个无名管道;
  • 参数:pipefd[0] 是无名管道的固定读端,pipefd[1] 是固定写端;
  • 返回值:成功返回 0,失败返回 - 1。

5.示例代码:父子进程通过无名管道通信

#include <stdio.h> #include <unistd.h> #include <string.h> #include <sys/wait.h> int main() { int pipe_fd[2]; pid_t pid; char read_buf[1024] = {0}; const char *write_data = "Hello from parent (pipe)!"; // 1. 创建无名管道 if (pipe(pipe_fd) == -1) { perror("pipe create failed"); return -1; } // 2. fork创建子进程(建立亲缘关系) pid = fork(); if (pid == -1) { perror("fork failed"); return -1; } // 3. 父进程:关闭读端,向管道写数据 if (pid > 0) { close(pipe_fd[0]); // 父进程仅写,关闭读端 write(pipe_fd[1], write_data, strlen(write_data)); close(pipe_fd[1]); // 写完关闭写端 wait(NULL); // 等待子进程执行完毕 } // 4. 子进程:关闭写端,从管道读数据 else { close(pipe_fd[1]); // 子进程仅读,关闭写端 read(pipe_fd[0], read_buf, sizeof(read_buf)); printf("Child read: %s\n", read_buf); close(pipe_fd[0]); // 读完关闭读端 } return 0; }

三、有名管道

有名管道对应 fifo,突破了亲缘关系限制,支持任意单机进程通信(只要知道管道的文件路径),且在文件系统中可见(有明确的路径名称)。

1.核心特性

  • 可给任意单机进程通信,文件系统中可见(有路径);
  • 基础特性与无名管道一致(半双工、特殊文件、不支持定位等);
  • 额外特性:若管道一端未打开,open 函数会默认阻塞。

2.编程顺序

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

3.核心函数:mkfifo

int mkfifo(const char *pathname, mode_t mode);
  • 功能:在指定路径下创建一个有权限的有名管道文件;
  • 参数:pathname 是有名管道的路径 + 名称,mode 是 8 进制的文件权限(如0666);
  • 返回值:成功返回 0,失败返回 - 1。

4.示例代码:两个无亲缘进程通过 FIFO 通信

  • 写进程(fifo_write.c):
#include <stdio.h> #include <unistd.h> #include <fcntl.h> #include <sys/stat.h> #include <string.h> #define FIFO_PATH "/tmp/my_fifo" int main() { // 1. 创建FIFO文件(已存在则忽略) if (mkfifo(FIFO_PATH, 0666) == -1) { perror("mkfifo failed (ignore if exist)"); } // 2. 打开FIFO文件(写模式) int fd = open(FIFO_PATH, O_WRONLY); if (fd == -1) { perror("open fifo failed"); return -1; } // 3. 向FIFO写数据 const char *msg = "Hello from FIFO write process!"; write(fd, msg, strlen(msg)); printf("Write to FIFO: %s\n", msg); // 4. 关闭并卸载FIFO close(fd); unlink(FIFO_PATH); return 0; }
  • 读进程(fifo_read.c):
#include <stdio.h> #include <unistd.h> #include <fcntl.h> #include <sys/stat.h> #include <string.h> #define FIFO_PATH "/tmp/my_fifo" int main() { char buf[1024] = {0}; // 1. 打开FIFO文件(读模式,阻塞等待写端) int fd = open(FIFO_PATH, O_RDONLY); if (fd == -1) { perror("open fifo failed"); return -1; } // 2. 从FIFO读数据 read(fd, buf, sizeof(buf)); printf("Read from FIFO: %s\n", buf); // 3. 关闭FIFO close(fd); return 0; }

四、无名管道与有名管道核心对比

对比维度无名管道(pipe)有名管道(FIFO)
通信范围仅亲缘关系进程任意单机进程
文件系统可见性不可见(内核维护)可见(有路径的特殊文件)
打开特性fork 后继承文件描述符一端未打开时 open 默认阻塞
生命周期随进程退出自动释放需手动 unlink 删除
创建方式pipe () 函数mkfifo () 函数

五、总结

  1. 管道是 Linux 最基础的 IPC 机制,核心分为无名管道(pipe)和有名管道(FIFO)两类,均为半双工、基于队列的特殊文件;
  2. 无名管道仅支持亲缘进程通信,无需手动清理;有名管道支持任意单机进程通信,需手动创建 / 删除;
  3. 管道读写需遵循核心规则,尤其注意 “读 / 写端关闭” 后的行为,避免进程崩溃或数据异常。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/10 3:10:45

1小时验证:用AI快速搭建Google镜像原型

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 快速生成一个Google镜像最小可行产品(MVP)&#xff0c;要求&#xff1a;1. 1小时内可完成部署 2. 只保留核心搜索功能 3. 使用现成模板 4. 支持快速迭代 5. 提供后续扩展建议。优先…

作者头像 李华
网站建设 2026/7/13 17:08:37

如何用AI快速找到并下载Postman历史版本

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 开发一个智能版本查询工具&#xff0c;输入Postman版本号或发布日期范围&#xff0c;自动从官方存档或镜像站点检索可下载的旧版本。要求&#xff1a;1)支持模糊查询和精确查询 2)显…

作者头像 李华
网站建设 2026/7/14 9:15:20

告别手动配置:AI自动化UDP/TCP性能调优

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 创建一个网络协议自动调优系统&#xff0c;功能&#xff1a;1) 自动检测当前网络环境(延迟、丢包率等)&#xff1b;2) 基于机器学习推荐UDP/TCP最佳参数(如窗口大小、超时设置等)&a…

作者头像 李华
网站建设 2026/7/12 21:06:00

金融图 Agent 的隐性风险在哪里?3个真实案例揭示评估漏洞

第一章&#xff1a;金融图 Agent 的风险评估在金融领域&#xff0c;图 Agent&#xff08;Graph Agent&#xff09;被广泛应用于识别复杂交易网络中的潜在风险行为&#xff0c;如洗钱、欺诈和异常资金流动。通过将账户、交易和实体建模为图中的节点与边&#xff0c;Agent 能够利…

作者头像 李华
网站建设 2026/7/13 11:58:07

还在手动巡检?用这4步自动化方案彻底升级你的Agent维护体系

第一章&#xff1a;气象观测 Agent 的设备维护在自动化气象监测系统中&#xff0c;气象观测 Agent 扮演着核心角色&#xff0c;负责采集、传输与初步处理来自各类传感器的数据。为确保其持续稳定运行&#xff0c;必须建立完善的设备维护机制。定期健康检查 气象观测 Agent 应每…

作者头像 李华
网站建设 2026/7/13 13:13:59

vue和springboot框架开发的社区流浪动物领养管理系统_65kwrn28

文章目录 具体实现截图主要技术与实现手段关于我本系统开发思路java类核心代码部分展示结论源码lw获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01; 具体实现截图 同行可拿货,招校园代理 vuespringboot_65kwrn28 框架开发的社区流浪动物领…

作者头像 李华