管道通信机制详解:无名管道 vs 有名管道

目录

 无名管道(匿名管道)

定义

特点

创建与使用

 有名管道(FIFO)

定义

特点

创建与使用

总结


在多进程通信中,管道是一种非常基本且实用的机制,它允许进程间进行数据传输。根据是否在文件系统中有名称(即是否持久化存在),管道主要分为两大类:无名管道(匿名管道)和有名管道(FIFO)。下面将详细介绍这两种管道的特点、创建方式以及使用场景。

 无名管道(匿名管道)

定义

无名管道是一种简单的进程间通信方式,它是在内存中开辟的一个缓冲区,仅限于具有亲缘关系的进程间使用,即通常是由一个进程通过fork()函数创建其子进程后,两者之间共享的通信通道。无名管道不与文件系统关联,因此得名“无名”。

特点

  • 半双工通信:数据只能单向流动,即在同一时间只能用于读或写,但通过在两个进程中分别创建读端和写端,可以实现双向通信。
  • 临时性:随着创建它的进程的终止而消失,不持久化存在。
  • 亲缘关系限制:仅适用于父子进程或者兄弟进程间的通信。

创建与使用

使用pipe()系统调用创建无名管道:

#include <unistd.h>int pipe(int pipefd[2]);
  • pipefd[0]为读端,用于读取数据。
  • pipefd[1]为写端,用于写入数据。
int pipefd[2];
if (pipe(pipefd) == -1) {perror("Pipe creation failed");exit(EXIT_FAILURE);
}

 有名管道(FIFO)

 

定义

有名管道,又称FIFO(First In First Out),是一种特殊类型的文件,存在于文件系统中,任何具有适当权限的进程都可以访问它,从而实现进程间的数据交换。它克服了无名管道的亲缘关系限制,使得不相关的进程也能通过它进行通信。

特点

  • 全系统可见:由于有名管道在文件系统中有对应的命名入口,因此可以在不相关进程间使用。
  • 半双工通信:与无名管道相同,数据也是单向流动,但可通过创建两个FIFO实现双向通信。
  • 持久性:除非显式删除,否则FIFO会一直存在,即使创建它的进程已经终止。

创建与使用

使用mkfifo()系统调用来创建有名管道:

#include<unistd.h>
#include<stdio.h>
#include<string.h>
#include<fcntl.h>
#include<sys/stat.h>
int main(){printf("%d进程,开始读取明管道文件\n",getpid());int fd = open("./myFifo",O_RDONLY);for(;;){char buf[128] = {};if(read(fd,buf,sizeof(buf)-sizeof(buf[0]))==-1){perror("write");return -1;}if(fd==0){printf("写入端关闭\n");break;}printf("%d进程,读取到数据了%s\n",getpid(),buf);}printf("关闭管道\n");close(fd);unlink("./myFifo");return 0;}

(第二段代码里面有个bug)

总结

无名管道和有名管道都是实现进程间通信的有效手段,选择哪种方式取决于通信需求。无名管道适用于父进程与子进程间的简单数据交换,而有名管道则提供了更灵活的跨进程通信能力,尤其适合那些无直接亲缘关系的进程间通信场景。理解它们的工作原理及差异,能帮助开发者更有效地设计多进程交互的应用程序

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/12748.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2024中国振威化工装备展

2024上海国际化工设备展览会 第十六届上海国际化工装备博览会将于2024年11月19-21日在国家会展中心&#xff08;上海&#xff09;举办&#xff0c;预计参展企业1000多家&#xff0c;展览面积7万平方米&#xff0c;观众突破10万人次。展会设置石化装备、化工单元设备、化工环保…

Flutter 中的 ChoiceChip 小部件:全面指南

Flutter 中的 ChoiceChip 小部件&#xff1a;全面指南 在Flutter中&#xff0c;ChoiceChip是一种特殊的组件&#xff0c;用于表示一组可选项中的单个选项。它通常用于实现简单的选择功能&#xff0c;如单选按钮或复选框。本文将详细介绍如何在Flutter应用中使用ChoiceChip。 …

【算法基础】你见过ST表吗?它竟然这么强大

文章目录 ST表&#xff08;Sparse Table&#xff09;观察预处理区间求和区间最小值查询 ST表&#xff08;Sparse Table&#xff09; ST表是一种用于区间查询的数据结构。它上面大部分的区间查询都是 O ( l o g n ) O(logn) O(logn)的时间。但它在查询区间最大值最小值问题上非…

算法课程笔记——蓝桥云课第11次直播

算法课程笔记——蓝桥云课第11次直播

收藏与品鉴:精酿啤酒的艺术之旅

啤酒&#xff0c;这一古老的酒精饮品&#xff0c;不仅是人们生活中的日常饮品&#xff0c;更是一种艺术和文化的载体。对于Fendi club啤酒而言&#xff0c;收藏与品鉴更是一门深入骨髓的艺术之旅。 Fendi club啤酒的收藏&#xff0c;不仅仅是简单的存放和保管&#xff0c;而是一…

交换机组网最常见的8大故障及解决方式

有朋友多次提到网络故障&#xff0c;其中在交换机组网时常见的故障比较多&#xff0c;为了便于大家排除这些故障&#xff0c;在此介绍一些常见的典型故障案例及处理思路。 故障1&#xff1a;交换机刚加电时网络无法通信 【故障现象】 交换机刚刚开启的时候无法连接至其他网络…

数据库面试题(MySQL、Oracle)

数据库 数据库的四大特性 原子性&#xff1a; 事务中的所有操作要么全部执行成功&#xff0c;要么全部执行失败&#xff0c;不存在部分执行的情况&#xff1b;成功必须要完全应用到数据库&#xff0c;失败则不能对数据库产生影响&#xff1b; 一致性&#xff1a; 事务在执…

Java面向对象——接口的定义与实现

普通类&#xff1a;只有具体实现 抽象类&#xff1a;具体实现和规范&#xff08;抽象方法&#xff09;都有 接口&#xff1a;只有规范。自己无法写方法。专业的约束&#xff01;约束和实现分离&#xff1a;面向接口编程 接口就是规范&#xff0c;定义的是一组规则&#xf…

k8s StatefulSet

Statefulset 一个 Statefulset 创建的每个pod都有一个从零开始的顺序索引&#xff0c;这个会体现在 pod 的名称和主机名上&#xff0c;同样还会体现在 pod 对应的固定存储上。这些 pod 的名称是可预知的&#xff0c;它是由 Statefulset 的名称加该实例的顺序索引值组成的。不同…

现货黄金在线交易有哪些优势_EE trade

现货黄金在线交易拥有几项独特优势&#xff0c;使其成为广受投资者青睐的贵金属投资方式&#xff1a; 1. 全天候交易 现货黄金市场几乎可以实现24小时不间断交易&#xff0c;投资者可以根据全球市场的变动随时参与交易&#xff0c;这提供了极大的灵活性和即时反应市场变化的能…

PyTorch 中构建神经网络的常用方法介绍

在 PyTorch 中构建神经网络通常有以下几种方法。每种方法都有其特定的应用场景&#xff0c;选择哪种方法取决于你的具体需求&#xff0c;例如模型的复杂度、是否需要多 GPU 训练、是否需要自定义层或操作等。在实践中&#xff0c;这些方法往往是相互结合使用的&#xff0c;以达…

Mysql 如何定位慢查询?

定位MySQL中的慢查询&#xff0c;就像侦探查找案件线索一样&#xff0c;一步步找到让数据库运行变慢的原因。 打开慢查询日志&#xff1a; 首先&#xff0c;得让MySQL开始记录那些跑得慢的查询。这就像是安装了一个监控摄像头&#xff0c;记录下所有的“嫌疑人”。在MySQL里&…

Nginx+Keepalived高可用集群

NginxKeepalived高可用集群 服务器准备 服务器名IP软件包主从n1RIP 192.168.99.111 VIP 192.168.99.200nginx keepaliveMASTERn2RIP192.168.99.122 VIP 192.168.99.200nginx keepalivedh1RIP 192.168.99.133 VIP 192.168.99.200httpdh2RIP 192.168.32.144 VIP 192.168.99.200h…

playwright 自动化框架python教程(七)

使用with语句管理资源生命周期后&#xff0c;还需要page.close()和context.close()吗&#xff1f; 当使用 with 语句管理 Playwright 的资源生命周期时&#xff0c;通常情况下不需要再显式调用 page.close() 和 context.close()。这是因为 with 语句会在其代码块执行完毕后自动…

从入门到精通:.gitlab-ci.yml文件的完整指南

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 从入门到精通&#xff1a;.gitlab-ci.yml文件的完整指南 前言.gitlab-ci.yml文件概述stagesimagesbefore_script和after_scripttagsonly和exceptonly关键字except关键字 artifacts使用方式产物路径其他…

写一个类ChatGPT应用,前后端数据交互有哪几种

❝ 对世界的态度&#xff0c;本质都是对自己的态度 ❞ 大家好&#xff0c;我是「柒八九」。一个「专注于前端开发技术/Rust及AI应用知识分享」的Coder 前言 最近&#xff0c;公司有一个AI项目&#xff0c;要做一个文档问答的AI产品。前端部分呢&#xff0c;还是「友好借鉴」Cha…

结项评审报告

项目名称&#xff0c;《结项评审报告》 项目名称项目编号本文件标识符Company-Project-PCM-REVIEW项目承担部门项目经理立项时间开发完成时间结项评审时间 目 录 0. 基本信息 3 1. 项目资产检查与处理 4 2. 项目综合评估 4 2.1 项目完成情况评估 4 2.2 项目质量评估 4 …

C++后端领域聚焦——存储系统和分布式系统

编程语言和脚本 C/C: 作为核心技能&#xff0c;需要深入理解并熟练使用 C/C 进行开发。Shell: 掌握常用的 Shell 脚本&#xff0c;有助于自动化日常任务和环境配置。Python: 常用于脚本编写、自动化测试、数据处理等&#xff0c;提高开发效率。 计算机基础 数据结构和算法: …

【小程序】怎么优化小程序的性能

优化小程序的性能是提高用户体验和确保应用顺畅运行的关键。以下是一些优化小程序性能的方法&#xff1a; 1. 代码优化2. 图片优化3. 网络请求优化4. 页面渲染优化5. 分包加载6. 使用性能分析工具7. 后端优化8. 用户体验优化 1. 代码优化 精简代码&#xff1a;删除不必要的代码…

16.ABA问题

文章目录 ABA问题1.什么是ABA问题&#xff1f;2.ABA问题解决方案2.1.使用AtomicStampedReference解决ABA问题2.2.使用AtomicMarkableReference解决ABA问题 ABA问题 因为CAS操作的原子性能高&#xff0c;在JUC中广泛被应用&#xff0c;但是如果使用的不合理&#xff0c;CAS操作就…