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

news2024/12/23 17:16:30

一、需求

现有两个进程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.coloradmin.cn/o/1326640.html

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

相关文章

大创项目推荐 深度学习 机器视觉 人脸识别系统 - opencv python

文章目录 0 前言1 机器学习-人脸识别过程人脸检测人脸对其人脸特征向量化人脸识别 2 深度学习-人脸识别过程人脸检测人脸识别Metric Larning 3 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 深度学习 机器视觉 人脸识别系统 该项目…

在RT-Thread中使用SystemView进行调试分析

一、SystemView SystemView is a toolkit for visual analysis of any embedded system. SystemView gives complete insight into an application, to gain a deep understanding of the runtime behavior, going far beyond what a debugger is offering. This is particula…

maven学习和maven聚合工程搭建

1.学习maven maven的概念 项目管理工具 &#xff0c;对jar进行依赖管理&#xff0c;编译&#xff0c;打包&#xff0c;单元测试&#xff0c;安装&#xff0c;部署&#xff0c;贯穿整个项目 为什么要学maven 要解决的问题&#xff1a; 不同的开发工具开发出来的项目目录结构…

元旦厦门游--ChatGPT/GPT4科研实践应用与AI绘图技术

2023年我们进入了AI2.0时代。微软创始人比尔盖茨称ChatGPT的出现有着重大历史意义&#xff0c;不亚于互联网和个人电脑的问世。360创始人周鸿祎认为未来各行各业如果不能搭上这班车&#xff0c;就有可能被淘汰在这个数字化时代&#xff0c;如何能高效地处理文本、文献查阅、PPT…

马蹄集第37周

1、最小子串覆盖 考点&#xff1a;双指针 代码&#xff1a; def judge(s,t,l,r):m [0] * (256)for i in t:m[ord(i)] 1for i in range(l,r1):if s[i] in t:m[ord(s[i])] - 1for i in m:if i > 0:return Falsereturn Truedef main():result "No"s input()t i…

EMNLP 2023 亮点回顾:大模型时代下的 NLP 研究

作为自然语言处理&#xff08;NLP&#xff09;领域的顶级盛会&#xff0c;EMNLP 每年都成为全球研究者的关注焦点。2023 年的会议在新加坡举行&#xff0c;聚集了数千名来自世界各地的专家学者&#xff0c;也是自疫情解禁以来&#xff0c;中国学者参会最多的一次。巧的是&#…

windows 快捷键 win+tab 图标显示工具栏设置

在Windows中&#xff0c;按下Win Tab组合键会打开任务视图&#xff0c;该视图显示当前打开的窗口以及工作区的虚拟桌面。如果你希望在任务视图中显示工具栏设置&#xff0c;可以按照以下步骤进行&#xff1a; 1. 打开设置&#xff1a; 使用快捷键Win I或在任务栏上右键单击开…

南京大学-软件分析-课程05-数据流分析基础理论2

7. 迭代算法与不动点定理关联 我们需要证明自己的Transfer Function是单调的 代码什么时候会停止 8. May/Must Analysis, A Lattice View May Analysis Unsafe result->Safe result 如果我是一个查错的定义&#xff0c; 没有no definition的错误&#xff0c;这是一个不安…

Java开发框架和中间件面试题(2)

8.说说自己对Spring MVC的了解&#xff1f; MVC是一种设计模式&#xff0c;Spring MVC是一款很优秀的MVC框架。Spring MVC可以帮助我们进行更简洁的Web层开发&#xff0c;并且它天生与Spring框架集成。SpringMVC下我们一般把后端项目分为Service&#xff08;处理业务&#xff0…

21、Web攻防——JavaWeb项目JWT身份攻击组件安全访问控制

文章目录 一、JavaWeb二、JWT攻击 一、JavaWeb webgoat 1.java web的配置文件&#xff0c;配置文件一般在META-INF目录下&#xff0c;文件名常为pom.xml或web.xml 2.如何通过请求&#xff0c;查看运行的java代码。 地址信息PathTraversal/profile-upload 直接找到以该字符P…

【网络技术设备安全】BGP 基础与概述-2-中转 AS 中的 IBGP 路由传递

0x01 中转 AS 中的 IBGP 路由传递 参考该图&#xff1a; 上图&#xff0c;我们模拟一个 1.0 的路由通过 AS 65101 来传递 1&#xff1a;通过图可知&#xff0c;A 与 B 之间的 Peer 为 EBGP&#xff0c;B 与 E 之间为 Peer IBGP&#xff0c;E 与 F 之间为 Peer EBGP 邻接 2&a…

python爬取网页图片并下载

python爬取网页图片并下载之GET类型 准备工作 【1】首先需要准备好pycharm&#xff0c;并且保证环境能够正常运行 【2】安装request模块 pip install requestsimport request导入request内置模块 【3】安装lxml模块 pip install lxmlfrom lxml import etree导入lxml.etre…

机器学习---随机森林

1、使用决策树来做回归或者预测值 如上图&#xff0c;使用学历、收入、身高、行业使用决策树来预测收到的邮件数。可以将邮件数分为几类&#xff08;也可以按照其他列&#xff0c;将邮件数分类&#xff09;&#xff0c;比如邮件数<23封属于A类&#xff0c;邮件数大于23<邮…

使用 Node.js 插件给指定目录下的所有图片添加上文字水印

说在前面 加水印是为了保护图片的版权和安全。在互联网上&#xff0c;很容易将图片下载或者截屏保存下来&#xff0c;然后进行二次使用&#xff0c;这就侵犯了原作者的版权。而加上水印可以使得图片更难被盗用&#xff0c;因为盗用者需要花费时间和精力去处理水印&#xff0c;而…

【稳定检索|投稿优惠】2024年交通运输与能源动力国际学术会议(IACTEP 2024)

2024年交通运输与能源动力国际学术会议(IACTEP 2024) 2024 International Academic Conference on Transportation and Energy Power(IACTEP) 一、【会议简介】 2024年交通运输与能源动力国际学术会议(IACTEP 2024)将在美丽的三亚盛大启幕。本次会议将聚焦交通运输与能源动力等…

【所有方法一览】大模型推理优化:在更小的设备运行、推理增速

大模型推理优化&#xff1a;在更小的设备运行、推理增速 知识蒸馏&#xff08;优先&#xff09;模型剪枝模型量化&#xff08;优先&#xff09;参数共享低秩分解参数搜索 知识蒸馏&#xff08;优先&#xff09; 知识蒸馏&#xff1a; 知识&#xff1a;模型参数、一堆矩阵蒸馏&…

C#线程Thread的使用

引言 在C#编程语言中&#xff0c;线程是一种并发执行的机制&#xff0c;可以实现多个任务同时执行&#xff0c;提高程序的效率和响应能力。C#提供了Thread类来处理线程相关的操作。本文将详细介绍C#中Thread类的使用方法和注意事项。 目录 引言线程的基本概念线程&#xff08;…

Ubuntu 常用命令之 sudo 命令用法介绍

&#x1f4d1;Linux/Ubuntu 常用命令归类整理 sudo命令在Ubuntu系统中是一个非常重要的命令&#xff0c;它允许系统管理员赋予某些用户&#xff08;或用户组&#xff09;以系统管理员的身份运行一些或全部的命令。sudo代表“superuser do”&#xff0c;即以超级用户的身份执行…

掌握Guava的并发工具:轻松应对复杂并发场景

推荐语 这篇文章介绍了 Guava 的一些常用并发工具类的使用方法。通过学习这些工具类&#xff0c;我们可以轻松地处理异步操作。这些工具类不仅功能丰富&#xff0c;还大大简化并发编程的复杂性。无论你是初学者还是经验丰富的开发者&#xff0c;这篇文章都会对你在并发编程方面…

2023年中国数据智能管理峰会(DAMS上海站2023)-核心PPT资料下载

一、峰会简介 数据已经成为企业的核心竞争力&#xff01;谁掌控数据、更好的利用数据、实现资产化&#xff0c;谁就会真正率先进入大数据时代。 1、数据智能管理趋势和挑战 在峰会上&#xff0c;与会者讨论了数据智能管理的最新趋势和挑战。随着数据量的不断增加&#xff0c…