进程间通信pipe
封面图
•
2025-12-01
•
嵌入式
172
0
0
0
在操作系统中,**进程间通信(Inter-Process Communication, IPC)** 是指不同进程之间进行数据交换和信息传递的方法。其中,**管道(Pipe)** 是一种常见的 IPC 机制,尤其在 Unix/Linux 系统中广泛使用。 --- ## 🧩 一、什么是管道(Pipe)? **管道** 是一种 **半双工** 的通信方式,通常用于具有 **父子关系** 的进程之间进行通信。它允许一个进程将数据写入管道,另一个进程从管道中读取数据。 ### ✅ 特点: - 半双工(只能单向通信) - 只能在有亲缘关系的进程之间使用(如父子进程) - 数据是 **先进先出(FIFO)** 的 - 内核维护的缓冲区 --- ## 🧠 二、管道的类型 在 Unix/Linux 中,主要有两种类型的管道: ### 1. **匿名管道(Anonymous Pipe)** - 由 `pipe()` 系统调用创建 - 没有名字,只能在具有亲缘关系的进程之间使用 - 常用于父子进程之间的通信 #### 示例代码(C语言): ```c #include <stdio.h> #include <unistd.h> #include <string.h> int main() { int fd[2]; // fd[0] 为读端,fd[1] 为写端 char buffer[100]; if (pipe(fd) == -1) { perror("pipe"); return 1; } pid_t pid = fork(); if (pid == 0) { // 子进程:读取数据 close(fd[1]); // 关闭写端 read(fd[0], buffer, sizeof(buffer)); printf("Child received: %s\n", buffer); close(fd[0]); } else { // 父进程:写入数据 close(fd[0]); // 关闭读端 write(fd[1], "Hello from parent!", strlen("Hello from parent!")); close(fd[1]); wait(NULL); // 等待子进程结束 } return 0; } ``` --- ### 2. **命名管道(Named Pipe / FIFO)** - 使用 `mkfifo()` 创建 - 有文件名,可以在任意进程之间使用(无需亲缘关系) - 类似于文件,可以被多个进程打开 #### 示例代码(C语言): ```c #include <stdio.h> #include <fcntl.h> #include <sys/stat.h> #include <unistd.h> #include <string.h> int main() { const char *fifo_name = "/tmp/myfifo"; mkfifo(fifo_name, 0666); int fd = open(fifo_name, O_WRONLY); write(fd, "Hello from writer!", 18); close(fd); fd = open(fifo_name, O_RDONLY); char buffer[100]; read(fd, buffer, sizeof(buffer)); printf("Reader received: %s\n", buffer); close(fd); unlink(fifo_name); // 删除命名管道 return 0; } ``` --- ## 📌 三、管道的优缺点 | 优点 | 缺点 | |------|------| | 简单易用 | 半双工,不能双向通信 | | 适合父子进程通信 | 不支持跨机器通信 | | 无须额外配置 | 仅限本地进程 | --- ## 🔁 四、管道 vs 其他 IPC 方法 | 通信方式 | 是否支持跨进程 | 是否支持跨机器 | 是否支持双向 | 是否需要亲缘关系 | |----------|----------------|----------------|--------------|------------------| | 管道(匿名) | 否 | 否 | 否 | 是 | | 命名管道(FIFO) | 是 | 否 | 否 | 否 | | 共享内存 | 是 | 否 | 是 | 否 | | 消息队列 | 是 | 是 | 是 | 否 | | 信号量 | 是 | 否 | 否 | 否 | | 套接字(Socket) | 是 | 是 | 是 | 否 | --- ## 🧰 五、总结 | 项目 | 内容 | |------|------| | 名称 | 管道(Pipe) | | 类型 | 匿名管道、命名管道(FIFO) | | 通信方向 | 半双工 | | 使用场景 | 父子进程、本地进程通信 | | 优点 | 简单、高效 | | 缺点 | 半双工、限制多 | --- 如果你对某种特定语言(如 Python、Java、C++)的管道实现感兴趣,也可以告诉我,我可以提供对应示例。
上一篇:
IIC通信协议
下一篇:
Linux系统对设备的并发操作
标题录入,一次不能超过6条
留言
评论