2026/1/9 11:43:28
网站建设
项目流程
网站开发工程师工资多少,诸城建设局网站,微网站页面菜单栏,贵阳网站建设gzzctyi目录
一、Linux IPC 的核心种类
1.古老的通信方式
2.IPC 对象通信#xff08;system v 标准#xff09;
3.socket 通信
二、无名管道#xff08;匿名管道#xff09;
1. 核心特性
2.读写行为规则
3.编程顺序
4.核心函数#xff1a;pipe
5.示例代码#xff1a;父…目录一、Linux IPC 的核心种类1.古老的通信方式2.IPC 对象通信system v 标准3.socket 通信二、无名管道匿名管道1. 核心特性2.读写行为规则3.编程顺序4.核心函数pipe5.示例代码父子进程通过无名管道通信三、有名管道1.核心特性2.编程顺序3.核心函数mkfifo4.示例代码两个无亲缘进程通过 FIFO 通信四、无名管道与有名管道核心对比五、总结一、Linux IPC 的核心种类1.古老的通信方式是 Linux 早期的基础 IPC 实现包括无名管道有名管道信号2.IPC 对象通信system v 标准基于内核对象的通信方式常用的有消息队列使用相对较少这里不讨论共享内存信号量集3.socket 通信支持跨主机的网络级通信核心场景是网络通信注管道的底层实现是队列数据遵循 “先进先出” 规则。二、无名管道匿名管道无名管道对应 pipe是仅支持亲缘关系进程如父子、兄弟进程通信的方式。1. 核心特性仅能给亲缘关系进程通信半双工工作模式实际编程按单工使用是特殊文件不支持定位操作lseek 对管道文件描述符 / 文件指针无效依赖文件 IO / 标准 IO 操作。2.读写行为规则管道的读写逻辑受缓冲区默认 64K和两端状态影响读端存在时写端持续写超 64K 会阻塞写得太快写端存在时读端读空管道会阻塞读得太快读端关闭后写端写管道会导致写进程崩溃管道破裂写端关闭后读端读完管道内容read 会返回 0标志进程间通信结束。3.编程顺序创建管道 → fork子进程 → 读写管道 → 关闭管道4.核心函数pipeint 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.核心函数mkfifoint 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 () 函数五、总结管道是 Linux 最基础的 IPC 机制核心分为无名管道pipe和有名管道FIFO两类均为半双工、基于队列的特殊文件无名管道仅支持亲缘进程通信无需手动清理有名管道支持任意单机进程通信需手动创建 / 删除管道读写需遵循核心规则尤其注意 “读 / 写端关闭” 后的行为避免进程崩溃或数据异常。