[linux]进程间通信-管道pipe的实际用法(写入/读取)

一、需求

现有两个进程A和B,B进程含较为独立且复杂的业务逻辑,A进程为主控进程,现A进程需要控制B进程执行对应的功能,且要保持响应及时。

二、分析

典型进程间通信案例,因此使用linux下的管道方法(pipe)。由于是无父子关系的两个进程的通信,因此使用命名管道,如是具有父子关系的进程,使用匿名管道。

三、操作

3.1管道初始化

        // 创建管道文件mkfifo(PIPE_NAME, 0777);

其中,参数1为需要创建的管道文件路径与名称,参数2为文件权限。

3.2管道打开

        fd = open(PIPE_NAME, O_WRONLY);// 打开管道文件if (fd < 0){printf("pipein: exit{open file failed}\n");perror("open");exit(1);}

注意,此时处于管道的输入进程(pipein),即A进程,此时如B进程还未启动,则程序会阻塞在open函数中,等待B进程打开管道。(重点:pipe管道在open中的现象为卡住、阻塞住)

仅在A进程中打开管道的现象:

当B进程启动后打开管道后的现象:

可以看到管道顺利流通。

也因此,为避免阻塞A进程的其他功能,会使用fork()创建子进程来进入阻塞等待B进程启动完成。

3.3管道写入

            // 写入数据printf("pipein: write msg=%d\n", time);sprintf(buffer, "%d\n", time);write(fd, buffer, sizeof(buffer));sleep(1);

同写文件操作一致。

3.4管道读取

            // 读取数据read(fd, buffer, sizeof(buffer));printf("pipeout: read msg=%s", buffer);sleep(1);

3.5管道释放

        // 删除管道文件unlink(PIPE_NAME);

如不执行删除操作,管道文件会一直存在,且可以被继续使用。

四、源码

4.1 pipein.c

    #include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <fcntl.h>#include <sys/types.h>#include <sys/stat.h>#define BUFFER_SIZE 256#define PIPE_NAME "/mnt/UDISK/q2j"int main(){int fd;char buffer[BUFFER_SIZE];pid_t pid;// 创建管道文件mkfifo(PIPE_NAME, 0777);printf("pipein: create mkfifo successed\n");fd = open(PIPE_NAME, O_WRONLY);// 打开管道文件if (fd < 0){printf("pipein: exit{open file failed}\n");perror("open");exit(1);}printf("pipein: opening pipe\n");int time = 0;while (1){time++;// 写入数据printf("pipein: write msg=%d\n", time);sprintf(buffer, "%d\n", time);write(fd, buffer, sizeof(buffer));sleep(1);}// 关闭文件close(fd);}

4.2 pipeout.c

    #include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <fcntl.h>#include <sys/types.h>#include <sys/stat.h>#define BUFFER_SIZE 256#define PIPE_NAME "/mnt/UDISK/q2j"int main(){int fd;char buffer[BUFFER_SIZE];pid_t pid;printf("pipeout: init successed\n");// 打开管道文件if ((fd = open(PIPE_NAME, O_RDONLY)) < 0){perror("open");exit(1);}while (1){// 读取数据read(fd, buffer, sizeof(buffer));printf("pipeout: read msg=%s", buffer);sleep(1);}// 关闭文件close(fd);// 删除管道文件unlink(PIPE_NAME);return 0;}

五、总结

注意使用管道时的阻塞情况。

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

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

相关文章

微服务实战系列之ZooKeeper(实践篇)

前言 关于ZooKeeper&#xff0c;博主已完整的通过庖丁解牛式的“解法”&#xff0c;完成了概述。我想掌握了这些基础原理和概念后&#xff0c;工作的问题自然迎刃而解&#xff0c;甚至offer也可能手到擒来&#xff0c;真实一举两得&#xff0c;美极了。 为了更有直观的体验&a…

1688商品API:电商行业的实时数据源

一、引言 在电商行业&#xff0c;数据是驱动业务增长的关键因素。实时、准确、全面的数据能够帮助企业更好地了解市场、把握用户需求、优化运营策略。然而&#xff0c;获取实时数据并不容易&#xff0c;尤其是对于电商企业来说。而1688商品API的出现&#xff0c;为电商行业提供…

【算法系列篇】递归、搜索和回溯(三)

文章目录 前言什么是决策树1. 全排列1.1 题目要求1.2 做题思路1.3 代码实现 2. 子集2.1 题目要求2.2 做题思路2.3 代码实现 3. 找出所有子集的异或总和再求和3.1 题目要求3.2 做题思路3.3 代码实现 4. 全排列II4.1 题目要求4.2 做题思路4.3 代码实现 前言 前面我们通过几个题目…

Hadoop Single Node Cluster的安装

Hadoop Single Node Cluster的安装 安装JDK查看java -version更新本地软件包安装JDK查看java安装位置 设置SSH无密码登录安装hadoop下载安装设置hadoop环境变量修改hadoop配置设置文件设置core-site.xml设置YARN-site.xml设置mapred-site.xml设置HDFS分布式文件系统创建并格式化…

部署LVS的NAT模式

实验准备 #负载调度器# 192.168.116.40 #内网 12.0.0.100 #外网 先添加双网卡 #web服务器# 192.168.116.20 #web1 192.168.116.30 #web2 #nfs共享服务# 192.168.116.10 #nfs systemctl stop firewalld setenforce 0 1.nfs共享文件 1…

AT32 F435简介3/N Memory Mapping

AT32 F435简介3/N Memory Mapping 1. 源由2. Memory Mapping2.1 AT32 F4352.2 STM32 F405 3. 总结4. 参考资料 1. 源由 对比STM32 F405进行AT32 F435 MCU的资料研读&#xff0c;期望获取更多差异化信息&#xff1b;配合ChibiOS的porting工作&#xff0c;有理有据&#xff1b;寻…

PHP-PhpSpreadsheet导出带图片方法

需求描述 导出表格&#xff0c;项目名称对应项目详情页面二维码。 实现方法 1&#xff0c;先将各个项目生成的二维码存放到了一个指定目录里面&#xff1b; 2&#xff0c;导出数据到excel表格 <?phpuse PhpOffice\PhpSpreadsheet\Spreadsheet; use PhpOffice\PhpSpread…

03_Web开发基础之综合应用

web开发基础之综合使用 学习目标和内容 1、能够描述jQuery的作用 2、能够使用jQuery的选择器获取元素 3、能够使用jQuery对HTML标签元素注册事件 4、能够使用jQuery对HTML元素的属性进行操作 5、能够描述Bootstrap的作用 6、能够使用Bootstrap创建简单网页 7、能够描述AJAX的作…

恒创科技:云服务器怎么买才便宜有优惠

随着云计算技术的不断发展&#xff0c;云服务器已经成为企业和个人用户的重要选择。然而&#xff0c;在购买云服务器时&#xff0c;价格和优惠成为了很多用户关注的焦点。那么&#xff0c;如何购买云服务器才能获得更优惠的价格呢&#xff1f;下面就为大家介绍一些购买云服务器…

yolo网络整理-网络结构原理与anchor

YOLOv5 是Glenn Jocher等人操刀研发&#xff0c;Ultralytics公司的开源项目&#xff0c;项目地址可点击。2020年6月发布以来&#xff0c;Ultralytics公司一直在对项目进行维护与更新&#xff0c;目前repo的star数目突破44k&#xff0c;YOLOv5的功能在迭代中越发强大与完善&…

了解葡萄酒最重要的是什么?

事实上&#xff0c;大多数人只知道葡萄酒是一种酒精饮料味道很好&#xff0c;是您享用食物和营造氛围的完美饮品。但我认为知道得多一点葡萄酒的知识会增加你的欣赏力&#xff0c;你不必搜索葡萄酒来找寻资料&#xff0c;因为标签上有很多信息。 葡萄酒标签里有什么&#xff1f…

MFC 程序执行流程

目录 MFC 程序启动 MFC 入口函数 程序执行流程总结 在Win32课程中WinMain由程序员自己实现&#xff0c;那么流程是程序员安排&#xff0c;但到了MFC中&#xff0c;由于MFC库实现WinMain&#xff0c;也就意味着MFC负责安排程序的流程。 MFC 程序启动 程序的启动&#xff0c;…