传统的进程间通信——管道通信

传统的进程间通信——管道通信

  • 管道是UNIX系统中最古老的进程间通信方式,是一种特殊文件读写机制

  • 当进程从管道文件中读取数据时,如果管道中没有数据则进程会进入阻塞状态,直到有数据读取出来才返回,因此不需要借助信号、文件锁来协调读写时间

  • 管道中的数据一旦读取完毕就会消失,因此也不需要管理文件的位置指针,所以使用管道文件比普通文件的进程间通信要方便很多

  • 古老的好处是所有系统都支持,早期的管道文件是半双工,现在有些系统支持管道文件的全双工,现在绝大多数情况已经不使用管道来通信了

有名管道:
  • 在文件系统中创建出一个实体的有文件名的管道文件,然后通过系统I/O的相关API来进行相关操作

使用函数创建:
#include <sys/types.h>
#include <sys/stat.h>
​
int mkfifo(const char *pathname, mode_t mode);
功能:创建一个有名管道文件
pathname:管道文件的名字
mode:管道文件的权限
返回值:成功返回0 失败-1
使用命令创建:
mkfifo <file>
管道单向通信的编程模型:
进程A      ->         进程B
创建有名管道      
打开管道              打开管道
写数据                读数据
关闭管道              关闭管道
删除管道                
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
​
int main(int argc,const char* argv[])
{//  创建管道文件if(mkfifo("fifo",0644)){perror("mkfifo");return -1;}
​//  打开管道int fd = open("fifo",O_WRONLY);if(0 > fd){perror("open");unlink("fifo");return -1;}
​char buf[256] = {};
​for(;;){printf(">>>");//  使用封装好的my_gets()gets(buf);//  写文件 发送数据write(fd,buf,strlen(buf));//  检查是否quitif(0 == strcmp(buf,"quit")){printf("通信结束\n");usleep(1000);break;}}//  关闭管道close(fd);
​//  删除管道unlink("fifo");
}
#include <stdio.h>                        
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
​
int main(int argc,const char* argv[])
{//  打开管道int fd = open("fifo",O_RDONLY);if(0 > fd){perror("open");return -1;}
​char buf[256] = {};
​//  读数据for(;;){read(fd,buf,sizeof(buf));printf("read:%s\n",buf);
​if(0 == strcmp(buf,"quit")){printf("通信结束\n");break;}}
​//  关闭管道close(fd);
}
​
​
匿名管道:
  • 只在内核中创建的管道文件对象并返回该对象的文件描述符,然后使用系统IO进行相关操作,匿名管道文件不会在文件系统中显示,在创建时不需要提供路径,也不会占用磁盘空间,只是使用内核空间来临时存储数据,当关闭文件描述符后会自动回收

  • 注意:只适合fork创建的有关系的父子进程之间进行通信

相关API:
#include <unistd.h>
int pipe(int pipefd[2]);
功能:创建出匿名管道文件对象,并返回该对象的文件描述符
pipefd:输出型参数,用于存储文件描述符的数组,其中pipefd[0]   用于读操作pipefd[1]   用于写操作
​
使用步骤:1、调用该函数在内核中创建出管道文件,并获取到该文件的两个文件描述符2、通过fork创建出子进程,子进程可以直接拷贝父进程的pipefd描述符3、写数据的进程要关闭读端,读数据的进程要关闭写端4、发送完毕后,父子进程分别关闭文件描述符
编程模型:
    父进程     ->      子进程创建匿名管道           创建子进程         拷贝一对fd关闭读端(fd[0])    关闭写端(fd[1])写数据(fd[1])      读数据(fd[0])关闭写              关闭读
#include <stdio.h>          
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
​
int main(int argc,const char* argv[])
{//  创建匿名管道int fd[2] = {};if(pipe(fd)){perror("pipe");return -1;}
​//  创建子进程if(fork()){//  父进程  负责写 关闭读close(fd[0]);char buf[256] = {};for(;;){printf("父进程>>>");gets(buf);write(fd[1],buf,strlen(buf));if(0 == strncmp(buf,"quit",4)){printf("通信结束\n");break;}usleep(1000);}usleep(1000);close(fd[1]);usleep(1000);}else{//  子进程  负责读 关闭写close(fd[1]);char buf[256] ={};
​for(;;){read(fd[0],buf,sizeof(buf));printf("read:%s\n",buf);if(0 == strncmp(buf,"quit",4)){printf("父进程要结束通信\n");break;}}close(fd[0]);}
}                                                                    

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

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

相关文章

Postman文件上传接口测试

接口介绍 返回示例 测试步骤 1.添加一个新请求&#xff0c;修改请求名&#xff0c;填写URL&#xff0c;选择请求方式 2.将剩下的media参数放在请求body里&#xff0c;选择form-data&#xff0c;选择key右边的类型为file类型&#xff0c;就会出现选择文件的按钮Select Files&a…

QT翻金币小游戏(含音频图片文件资源)

目录 QT翻金币小游戏 音频图片资源文件获取 效果展示 图片 视频 实现代码 main.cpp mymainwindow.h mymainwindow.cpp startscene.h startscene.cpp selectscene.cpp playscene.h playscene.cpp mypushbutton.h mypushbutton.cpp dataconfig.h dataconfig.cpp QT…

大模型时代,云南白药如何成为一家AI医药企业?|产业AI案例

作者|斗斗 编辑|皮爷 出品|产业家 中医药大模型发布&#xff1b;英伟达成立AI制药部门&#xff0c;发力生物制药领域&#xff1b;赛诺菲与百图生科达成战略合作&#xff0c;共同开发用于生物治疗药物发现的领先模型&#xff1b;京东发布医疗大模型&#xff1b;百度“产业级”…

读软件开发安全之道:概念、设计与实施04缓解

1. 缓解 1.1. 安全思维转换为有效行动的方法就是首先预判威胁&#xff0c;然后针对可能的漏洞加以保护 1.2. 主动响应的做法就叫做“缓解” 1.2.1. mitigation 1.2.2. 喂宝宝的时候给孩子围上围嘴&#xff0c;避免掉下来的食物粘在宝宝的衣服上&#xff0c;还有安全带、限速…

ansync/await 运行流程图

1、流程图&#xff1a; 2、await 之后的方法是何时执行&#xff0c;如何执行的&#xff1f; await 的方法在 Task 执行完成之后&#xff0c;通过调用 Finish 方法执行的。 具体的执行步骤是先将 MoveNext 方法注册到 Task 的回调里&#xff0c;然后在 Task 执行完后调用这个方法…

ID3算法详解:构建决策树的利器

目录 引言 ID3算法概述 算法基础 信息熵 ​编辑 信息增益 ID3算法步骤 决策树 概念: 核心&#xff1a; 节点 1. 根节点 2. 非叶子节点 3. 叶子节点 引言 在机器学习领域&#xff0c;决策树是一种非常流行的分类和回归方法。其中&#xff0c;ID3算法作为决策树算法…

jenkins最佳实践(二):Pipeline流水线部署springCloud微服务项目

各位小伙伴们大家好呀&#xff0c;我是小金&#xff0c;本篇文章我们将介绍如何使用Pipeline流水线部署我们自己的微服务项目&#xff0c;之前没怎么搞过部署相关的&#xff0c;以至于构建流水线的过程中中也遇到了很多自己以前没有考虑过的问题&#xff0c;特写此篇&#xff0…

使用 Python 进行 PDF 文件加密

使用 Python 解密加密的 PDF 文件-CSDN博客定义一个名为的函数&#xff0c;该函数接受三个参数&#xff1a;输入的加密 PDF 文件路径input_pdf、输出的解密 PDF 文件路径output_pdf和密码password。https://blog.csdn.net/qq_45519030/article/details/141256661 在数字化时代…

Linux驱动开发基础(设备树)

所学来自百问网 目录 1. 引入设备树的原因 2. 设备树语法 2.1 Devicetree格式 2.1.1 DTS文件格式 2.1.2 node的格式 2.1.3 properties的格式 2.1.4 dts 文件包含dtsi文件 2.2 常用属性 2.2.1 #address-cells、#size-cells 2.2.2 compatible 2.2.3 model 2.2.4 st…

Total Commander 右键卡死问题,百度云冲突

一段时间TC总是右键卡死&#xff0c;后来发现是跟百度云冲突了&#xff0c;只要把右键菜单里的百度云删除即可 不仅仅是跟TC冲突&#xff0c;资源管理器也受累的 可以通过360安全卫士的右键菜单管理搞定&#xff0c;也可以注册表删除&#xff0c;可以先备份注册表 运行里 re…

一步解决Ubuntu中/mnt/hgfs无共享文件夹的问题

当我们启用了共享文件夹后&#xff0c;但是在终端/mnt/hgfs任然没有文件 在终端输入 sudo vmhgfs-fuse .host:/ /mnt/hgfs/ -o allow_other 之后&#xff0c;就可以查到共享文件了

复现 LET-NET

摘要 稀疏光流法是计算机视觉中的一项基本任务。然而&#xff0c;它依赖于恒定的假设限制了其在高动态范围&#xff08;HDR&#xff09;场景中的适用性。在本研究中&#xff0c;我们提出了一种新的方法&#xff0c;旨在通过学习一个对光照变化具有鲁棒性的特征映射来超越图像的…

【TC3xx芯片】TC3xx芯片CAN模块详解

目录 前言 正文 1.CAN硬件资源】 1.1. CAN硬件单元 1.2. CAN时钟 1.2.1. CAN时钟设计 1.2.2. MCMCAN配置实例 1.3. CAN中断 1.3.1. TC3xx芯片CAN中断设计 1.3.2. 通过查看寄存器看中断配置和产生状态 1.3.3. 实际AUTOSAR工程CAN中断配置 2.功能描述 2.1. 操作模式…

KubeSphere核心实战_kubesphere部署redis01_为redis指定配置文件_指定存储卷_配置服务---分布式云原生部署架构搭建047

然后我们再来,部署一下redis,可以看到,首先去容器官网去找到对应的redis的镜像然后 可以看到镜像中都有说的,如何启动,以及 --appendonly yes 是指定持久化.然后 /data表示数据存储的位置. 可以看到数据存储位置 然后还有配置文件的位置. 可以看到,我们首先去创建配置文件,然后…

LNMP 架构(Linux+NGINX+memcache+PHP)

目录 1 源码编译PHP与NGINX 1.1 NGINX 源码编译 1.2 PHP 源码编译安装 2 实现PHP与NGINX的连接 2.1 php-fpm的详细介绍 2.2 LNMP与LAMP的区别 2.3 PHP配置文件的介绍 2.4 实例实现php-fpm 与 NGINX的连接 2.4.1 指定pid的存放位置 2.4.2 php-fpm设置监听自己端口与IP 2.4.3 主配…

配置 昇腾 Ascend C/C++ 开发环境

配置 昇腾 Ascend C/C 开发环境 flyfish 这里以Orange Pi Ai Pro 为例 先说如何配置MindStudio&#xff0c;然后再说如何查看Orange Pi Ai Pro的一些信息 Orange Pi AI Pro 开发板是香橙派联合华为精心打造的高性能AI 开发板&#xff0c;其搭载了昇腾 AI 处理器。Linux 桌面…

VSCode系列 - 如何用VSCode搭建C++高效开发环境(2)

1. 插件的用法 1.1. C/C 1.1.1. 插件介绍1.1.2. 插件配置 1.2. Clang-Format1.3. cpp-check-lint 1.3.1. cpplint1.3.2. cppcheck1.3.3. 插件的使用 1.4. C/C Advanced Lint 1.4.1. 插件介绍1.4.2. 插件配置 1.5. Bracket Pair Colorizer 1.5.1. 插件介绍1.5.2. 功能配置 1.6. …

海外独立站站外推广:拓展全球市场的策略与实践

海外独立站的站外推广是一个系统工程&#xff0c;涉及市场研究、品牌本土化、多渠道推广、广告投放、网站体验优化、客户服务和数据分析等多个方面。通过本文的探讨&#xff0c;企业可以更好地理解海外推广的策略和实践&#xff0c;把握全球化电商的发展趋势&#xff0c;实现企…

【机器学习】探索机器学习在旅游业的革新之旅

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀目录 &#x1f50d;1. 引言&#x1f4d2;2. 机器学习在旅游需求分析中的应用&#x1f31e;用户行为数据分析&#x1f319;旅客偏好预测模型⭐…

Java面试八股之如何保证消息队列中消息不重复消费

如何保证消息队列中消息不重复消费 要保证消息队列中的消息不被重复消费&#xff0c;通常需要从以下几个方面来着手&#xff1a; 消息确认机制&#xff1a; 对于像RabbitMQ这样的消息队列系统&#xff0c;可以使用手动确认&#xff08;manual acknowledge&#xff09;机制来…