Linux之进程间通信(三)--命名管道

📅 2026/8/7 5:07:54
Linux之进程间通信(三)--命名管道
命名管道之前说到有血缘关系的进程可以实现管道通信但是要是没有血缘关系的进程也可以进行管道通信的---这种管道就是命名管道如果再来一个进程和当前进程一样打开同一个文件,文件的核心数据结构和缓冲区只会存在一份那么怎么确定两个进程打开的文件是同一个文件???只要访问同一个路径下的同一个文件,文件名路径唯一inode但是和之前的磁盘文件不同的是内核缓冲区不会刷新到磁盘系统mkfifomkfifo namedpipe它拥有自己独立的inode,并且p-说明其为管道文件但是他并不需要任何的磁盘空间我们可以试一下往这个文件里面写入,再由另外一个进程进行读取代码.hpp是 C 的头文件全称 header‑plus‑plus。 简单理解就是把 .h 头文件 .cpp 实现写在同一个文件里面。什么时候必须用 hpp???C 模板 templatetemplate 类、template 函数必须写在头文件模板代码编译阶段实例化编译器需要看到完整源代码不能分离到 cpp。 这种场景最适合.hpp。创建文件如果我们再次运行我们就发现报错,因为这个文件已经存在,inode是唯一的删除文件我们除了可以用rm也可以用unlink,他就是解除了文件和inode之间的映射系统调用再main函数里面创建后再删除当然我们想要更加完善一点文件创建前就检查文件是否存在,不存在则创建,存在就不创建,然后在进程结束时将管道文件删除再创建管道的成员函数时,添加判断管道文件是否存在判断管道是否存在的核心逻辑,用stat参数说明pathname文件路径字符串可以普通文件、目录、命名管道 (FIFO)、设备文件。statbuf传出参数传入struct stat结构体指针内核会把文件全部属性填充到这个内存。restrictC 语言指针限定修饰符告诉编译器两个指针不会指向同一块内存用于编译器优化写代码时可以直接忽略这个关键字。返回值成功返回0文件信息存入statbuf失败返回‑1设置 errno文件不存在、权限不足等打开文件这里打开文件和之前文件的操作类似,也是用open函数来进行实现定义打开方式时写还是读打开打开了文件,然后要接受信息和发送信息server进行信息接收client进行发送信息注意再通信没有开始之前,如果读端打开但是写端没有打开,读端的open就会阻塞,直到write打开为什么呢??命名管道FIFO默认是阻塞模式。 管道本质是内核中的一块缓冲区设计语义管道必须同时存在读端、写端open 调用才返回。服务端open(fifo,O_RDONLY)只读打开 此时内核发现只有读文件描述符没有任何写端打开这个管道。open()直接挂起阻塞让出 CPU休眠不返回。直到客户端执行open(fifo,O_WRONLY)只写打开。 内核看到现在管道同时具备读端 写端。 此时两边的open()全部唤醒函数返回程序继续往下跑。