Linux进程间通信——匿名管道

news2024/12/28 4:08:16

文章目录

    • 进程间通信
    • 管道
      • 匿名管道
      • 匿名管道使用

进程间通信

进程设计的特点之一就是独立性,要避免其他东西影响自身的数据

但有时候我们需要共享数据或者传递信息,传统的父子进程也只能父进程传递给子进程信息

因此进程间通信还是很必要的,除此之外网络通信中所说的进程间通信本质上也是两个进程进行通信,只不过信息传递经过了繁杂的计算机网络

进程间通信有很多类型,但是利用管道进行进程间通信对我们了解底层原理还是很有帮助的,因此我们也从管道开始介绍

管道

在我们学习Linux指令的时候,有一个字符是|,用于将前一个指令的输出传递给下一个指令作为输入

通过这么久的学习,我们可以大概猜测出这个管道的原理是什么样的

两个指令本质上就是两个进程,利用管道进行通信,将两个管道连接起来

如何控制这两个进程的输入输出呢,其实就用到了之前的重定向功能

头一个指令的输出进行重定向,后一个指令的输入重定向就可以实现这样的功能了

在这里插入图片描述

再深入一点,管道的本质其实就是一个被打开的文件,但同时能被两个进程访问,而且只能一个进程写,另一个进程读

匿名管道

匿名管道通常用于父子进程的通信

父进程使用pipe函数创建管道

请添加图片描述

这个函数的参数是一个描述符数组,下标0表示读,下标1表示写,成功返回0,失败返回错误码

这个pipe函数实际上做了什么操作呢,可以简单理解为,操作系统创建了一个文件,然后再给两个文件标识符,一个用来表示读,一个用来表示写

请添加图片描述

然后再用fork函数创建子进程,由于子进程是写时拷贝父进程的,因此对子进程来说,他的文件描述符表也有一个读接口和一个写接口是指向匿名管道的

image.png

但是管道通信是半双工的,我们不允许两个进程同时输入或者输出,只允许单向传递

因此,我们直接关掉某一方的读,另一方的写

这样就能变成一个单向通信了

image.png

但是如果有需要实现双向通信,我们也可以在父进程开两个管道,然后对应做相应的操作就可以了

匿名管道使用

#include<iostream>
#include<cstring>
#include<cassert>
#include<unistd.h>
#include<sys/types.h>
#include<sys/wait.h>

using namespace std;

int main()
{
    // 创建管道
    int pipefd[2] = {0};
    int n = pipe(pipefd);
    assert(n==0); // 确保管道创建成功

    // 创建子进程
    pid_t pid = fork();
    assert(pid>=0);
    if(pid==0) // 子进程
    {
        close(pipefd[0]); // 关闭子进程的读
        int count = 0;
        string str = "a massage";
        char send_buffer[1024];
        while(count<=5)
        {
            snprintf(send_buffer, sizeof(send_buffer), "%d[%d]:%s", getppid(), count++, str.c_str()); // 写入缓冲区
            write(pipefd[1], send_buffer, sizeof(send_buffer)); // 写入管道文件
        }
        cout<<"子进程退出"<<endl;
        exit(0);
    }

    // 父进程
    close(pipefd[1]); // 关闭父进程的写
    char read_buffer[1024];
    while(1)
    {
        ssize_t s = read(pipefd[0], read_buffer, sizeof(read_buffer)-1); // 从管道读到缓冲区
        if(s>0) // 读到了内容
        {
            read_buffer[s] = '\0'; // 文件操作不endl;会自带'\0' 需要手动添加
            cout<<"子进程说的内容是:"<<read_buffer<<endl;
        }
        else // 读到了0,说明写的接口已经关了
        {
            break;
        }
    }
    pid_t ret = waitpid(pid, NULL, 0);
    assert(ret>0);
    return 0;
}

管道通常用于父子进程的通信,并且使用的是字节流的服务

管道是基于文件的,当进程结束的时候,管道也就会销毁

管道是有大小限制的,一般为64KB

当写比读快时,写满了就会写阻塞

当读比写快时,读完了就会读阻塞

写的一端关闭了,读的一端会读到0,表示结束

读的一端关闭了,写的一端继续写就会直接终止进程(操作系统通过信号终止)

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

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

相关文章

Apollo9.0 PNC源码学习之Planning模块—— Lattice规划(三):静态障碍物与动态障碍物ST图构建

参考文章: (1)Apollo6.0代码Lattice算法详解——Part4:计算障碍物ST/SL图 (2)自动驾驶规划理论与实践Lattice算法详解 1 计算障碍物ST/SL图 计算障碍物ST/SL图主要函数关系图: // 通过预测得到障碍物list auto ptr_prediction_querier = std::make_shared<Predict…

2024新型数字政府综合解决方案(五)

新型数字政府综合解决方案通过集成人工智能、大数据、区块链和云计算技术&#xff0c;打造了一个智能化、透明化和高效的政务服务平台&#xff0c;旨在提升政府服务的响应速度、处理效率和数据安全性。该方案实现了跨部门的数据共享与实时更新&#xff0c;通过智能化的流程自动…

Waterfox vG6.0.8 官方版下载和安装步骤(一款响应速度非常快的浏览器)

前言 Waterfox 水狐浏览器&#xff0c;从字面上我们可以轻松的了解该款浏览器的一些特点。Waterfox是通过Mozilla官方认证的纯64位版火狐浏览器&#xff0c;而Waterfox 10采用Firefox 10官方源码编译而成&#xff0c;改进了大内存和64位计算的细节&#xff0c;在64位Windows系…

用Python读取Excel数据在PPT中的创建图表

可视化数据已成为提高演示文稿专业度的关键因素之一。使用Python从Excel读取数据并在PowerPoint幻灯片中创建图表不仅能够极大地简化图表创建过程&#xff0c;还能确保数据的准确性和图表的即时性。通过Python这一桥梁&#xff0c;我们可以轻松实现数据自动化处理和图表生成&am…

MyBatis全解

目录 一&#xff0c; MyBatis 概述 1.1-介绍 MyBatis 的历史和发展 1.2-MyBatis 的特点和优势 1.3-MyBatis 与 JDBC 的对比 1.4-MyBatis 与其他 ORM 框架的对比 二&#xff0c; 快速入门 2.1-环境搭建 2.2-第一个 MyBatis 应用程序 2.3-配置文件详解 (mybatis-config.…

软件需求设计分析报告(Word原件)

第1章 序言 第2章 引言 2.1 项目概述 2.1.1 项目背景 2.1.2 项目目标 2.2 编写目的 2.3 文档约定 2.4 预期读者及阅读建议 第3章 技术要求 3.1 软件开发要求 3.1.1 接口要求 3.1.2 系统专有技术 3.1.3 查询功能 3.1.4 数据安全 3.1.5 可靠性要求 3.1.6 稳定性要求 3.1.7 安全性…

练习:python条件语句、循环语句和函数的综合运用

需求描述&#xff1a; 期望输出效果&#xff1a; 练习成果&#xff1a; #简单的银行业务流程 many 50000 def main_menu():print("----------主菜单----------"f"\n{name}您好&#xff0c;欢迎来到ATM&#xff0c;请选择操作&#xff1a;""\n查询余…

鼠标手势软件,效率办公必备!移动鼠标即可执行命令

鼠标手势软件是一种通过在屏幕上绘制特定手势来触发预设操作或命令的工具&#xff0c;它能够极大地提高用户的操作效率&#xff0c;特别是在进行重复性工作时尤为明显。这类软件通常支持多种手势操作&#xff0c;如拖拽、双击、滚动等&#xff0c;并允许用户自定义手势以适应个…

【Linux】系列入门摘抄笔记-8-权限管理chmod/chown

Linux操作系统中文件的基本权限由9个字符组成&#xff0c;分别为属主、属组和其他用户&#xff0c;用于规定是否对文件有读、写和执行权限。 文件/目录的权限与归属 目录列表中&#xff0c;有9列 第一列&#xff1a;文件类型与权限&#xff08;共10个字符&#xff0c;分为四组…

RAG完整构建流程-从入门到放弃

RAG完整构建流程 LLM模型缺陷&#xff1a; ​ 知识是有局限性的(缺少垂直领域/非公开知识/数据安全) ​ 知识实时性(训练周期长、成本高) ​ 幻觉问题(模型生成的问题) ​ 方法&#xff1a;Retrieval-Augmented Generation&#xff08;RAG&#xff09; ​ 检索&#xff1…

网络安全实训第三天(文件上传、SQL注入漏洞)

1 文件上传漏洞 准备一句话文件wjr.php.png&#xff0c;进入到更换头像的界面&#xff0c;使用BP拦截选择文件的请求 拦截到请求后将wjr.php.png修改为wjr.php&#xff0c;进行转发 由上图可以查看到上传目录为网站目录下的upload/avator,查看是否上传成功 使用时间戳在线工具…

有哪些好用的桌面管理

Fences&#xff08;适用于Windows&#xff09;&#xff1a; Fences 是一个非常流行的 Windows 桌面组织工具&#xff0c;它允许用户将图标、文件、文件夹等拖放到名为“Fences”的区域中&#xff0c;从而保持桌面的整洁有序。Fences 还支持自动隐藏空白的 Fences&#xff0c;以…

PC端实现语音识别功能

场景需求&#xff1a; 点击录音按钮&#xff1a; 如没有检测到录音设备&#xff0c;提示&#xff1a;“无法找到麦克风设备&#xff0c;请检查设备连接”。如录音设备连接正常&#xff1a;录音按钮变成录制状态&#xff0c;开始录制声音&#xff0c;同时输入框禁止键盘输入。 再…

修改esxi root用户密码

登录vcenter&#xff0c;鼠标右键点击主机&#xff0c;选择主机配置文件------提取主机配置文件 然后对提取的文件输入一个名称清晰容易分辨的名称&#xff0c;如xxx主机修改密码配置文件。 选择顶部的菜单&#xff0c;选择“策略和配置文件” 选择左侧的主机配置文件&#xf…

Oracle导入dmp文件

文章目录 写在前面一、详细知识点1、dmp文件2、导出dmp文件2.1、exp和expdp区别2.2、exp导出操作2.3、expdp导出操作2.4、PL/SQL使用客户端导出2.4.1 特殊说明2.4.2 操作指引 3、导入dmp文件3.1、imp和impdp区别3.2、imp导入操作3.3、impdp导入操作3.4、PL/SQL使用客户端导入 二…

语言无界,沟通无限:2024年翻译软件新趋势

无论是商务洽谈、学术研究、旅游探险&#xff0c;还是日常交流&#xff0c;高效、准确的翻译工具都成为了人们不可或缺的助手。百度翻译在线翻译是我最早接触的翻译工具&#xff0c;这次我们就一起找寻还有哪些好用的翻译工具吧。 1.福晰在线翻译 链接直达>>https://fa…

[4.10]-AutoSAR零基础学习-(SHE)Secure Hardware Extension规范<2>- Memory update protocol

既然已经看到这篇文章&#xff0c;说明开始研究SHE的安全更新协议了&#xff0c;协议具体去看原文吧&#xff0c;下面的工具是自己实现的桌面工具&#xff0c;可以在多平台使用&#xff0c;支持SHE&#xff0f;SHE / SHE_Extend&#xff0c;协议可自行定制。 >总目录<

亚马逊账户运营:揭秘那些你应该知道的坑。

在亚马逊平台上&#xff0c;选品过程与选择竞争对手的策略相似&#xff0c;都需要深思熟虑。许多卖家在选品时&#xff0c;会广泛收集并分析各种数据&#xff0c;但有时过于依赖数据而忽略了产品的实际竞争力和市场适应性。结果&#xff0c;他们可能选中了在理论上很理想&#…

leetcode 885. Spiral Matrix III

题目链接 You start at the cell (rStart, cStart) of an rows x cols grid facing east. The northwest corner is at the first row and column in the grid, and the southeast corner is at the last row and column. You will walk in a clockwise spiral shape to visi…

[算法题]在排序数组中查找元素的第一个和最后一个位置

题目链接: 在排序数组中查找元素的第一个和最后一个位置 二分查找求解, 但是普通版本的二分查找无法求解, 普通版本的二分查找每次根据中点的值与目标值进行区间划分, 但是该题数据为非递减顺序, 所以可能出现如下情况: nums [1, 2, 3, 3, 3, 4, 5, 6] target 3 此时普通版本…