Linux-进程间通信_管道

项目场景:

须熟知文件管理和进程方面的基础知识

通过Xshell和VScode 相互进行远程开发,学习进程间通信的其中一种方式——管道。


问题描述

依照我们曾经所学的知识,我们仅仅只能在单个进程中进行数据的交互,但是在实际应用中,单个进程不说不能实现一个产品的全部功能,但是会十分糅杂且出现问题很难定位。

而我们从以往学习的知识中,我们了解到进程之间是十分具有独立性的,例如父子进程各自修改重叠数据会有写实拷贝,所以,我们如果要进行进程间通信,其实成本是较为巨大的,但是又是尤为重要。

那么对于以后的开发,我们就要学会多进程乃至多线程通信交互,而今天,我们来学习多进程间通信的第一种方式——管道。


什么是管道

管道,是原生Linux系统提供的一个进程间通信的方式,一般使用于父子进程当中
pipe使用手册
管道的原理就是父子进程打开同一块文件,我们称这个文件叫做"管道"。因为父子进程由于进程的独立性,基本上从数据方面可以说是互不干扰,那么就可以由操作系统帮我们打开一个文件,让父子进程同时看到一块同样的管道文件区域,再通过这个管道文件实现通信。

需要注意的是,管道是单向的,且不止可以仅连接两个进程,可以连接多个进程。

分析:

pipe(管道)

int pipefd[2] = {0};
int ret = pipe(pipefd);

首先我们来看pipe函数的参数,pipefd是一个空间为2的int数组,如果我们在一些编程题网站做过题目,就应该知道“输出型参数”,而这里的pipefd就是充当输出型参数。

输出型参数:将需要从函数内部运行过程中的数据通过输出型参数来获取出来,比如说一个函数可以有返回值,但是我们如果需要从一个函数获取不止一个变量的数据甚至不同类型的数据,那么输出型参数就可以帮我们解决这个问题。

例如这里的pipe函数,我们需要将管道函数帮我们打开的管道通信文件的fd获取,这样我们才可以进行通信


这里的pipefd[0]是代表着管道的读端,pipefd[1]代表着管道的写端
!](https://img-blog.csdnimg.cn/direct/832b48dbdfea47a59232fec7900da244.png)

返回值代表是否成功创建一个管道,如果返回值为-1,则管道创建失败。

使用代码

#include<iostream>
#include<sys/types.h>
#include<sys/unistd.h>
#include<sys/wait.h>
#include<assert.h>
#include<stdio.h>
#include<unistd.h>
#include<string.h>
using namespace std;
int main()
{
    int pipefd[2] = {0}; //pipefd[0] 读端  pipefd[1] 写端
    int ret = pipe(pipefd);
    assert(ret != -1);
    #ifdef DEBUG
        cout << "pipefd[0]:"<< pipefd[0] <<endl;
        cout << "pipefd[1]:"<< pipefd[1] <<endl;
    #endif
    int pid = fork();
    assert(pid != -1);
    if(pid > 0)
    {
        //父进程 进行读操作
        //1.关闭写的fd
        close(pipefd[1]);
        //开辟缓冲区
        char buffer_read[1024];
        //进行读操作
        while(1)
        {
            int len = read(pipefd[0],buffer_read,sizeof(buffer_read)-1);
            if(len > 0)
            {
                buffer_read[len] = '\0';
            }
            cout<< "父进程:"<<buffer_read<<endl;
        }
        waitpid(fd,nullptr,0);
    }
    else if(pid == 0){
        //子进程 进行写操作
        //1.关闭读的fd
        close(pipefd[0]);
        //2.1开辟缓冲区
        char buffer_write[1024];
        //2.2传输的小溪
        string message = "I am son, i am writing message for father!";
        //进行写操作
        int count = 0;
        while(1)
        {
            //snprintf 初始化缓冲区
            snprintf(buffer_write,sizeof(buffer_write),"%s:%d",message.c_str(),++count);
            //开始向文件缓冲区进行写数据
            write(pipefd[1],buffer_write,strlen(buffer_write));
            sleep(1);
        }
        exit(0);
    }
    return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

geemap学习笔记041:Landsat Collection2系列数据去云算法总结

前言 去云算法是进行数据处理中所要进行一步重要操作&#xff0c;Sentinal-2数据中已经提供了去云算法&#xff0c;但是Landsat Collection2系列数据中并没有提供去云算法&#xff0c;下面就以Landsat 8 Collection2为例进行介绍。 1 导入库并显示地图 import ee import gee…

二进制安装包安装Prometheus插件安装(mysql_exporter)

简介 mysql_exporter是用来收集MysQL或者Mariadb数据库相关指标的&#xff0c;mysql_exporter需要连接到数据库并有相关权限。既可以用二进制安装部署&#xff0c;也可以通过容器形式部署&#xff0c;但为了数据收集的准确性&#xff0c;推荐二进制安装。 一&#xff0c;下载安…

【CSS】浅学一下filter

目录 1、基本概念 2、用法 3、应用案例 更加智能的阴影效果&#xff1a; 元素、网页置灰 元素强调、高亮 毛玻璃效果 调整网页sepia 褐色值可以实现护眼效果 1、基本概念 CSS filter 属性将模糊或颜色偏移等图形效果&#xff08;对比度、亮度、饱和度、模糊等等&#…

MySQL基础篇(四)事务

一、事务简介 事务是一组操作的集合&#xff0c;它是一个不可分割的工作单位&#xff0c;事务会把所有的操作作为一个整体一期向系统提交或撤销操作请求&#xff0c;即这些操作要么同时成功&#xff0c;要么同时失败。 注意&#xff1a; 默认 MySQL 的事务是 自动提交 的&#…

使用Docker方式安装Artifactory

1、安装前环境准备 首先要关闭防火墙&#xff0c;关闭Selinux&#xff0c;准备好安装好的docker。以下安装版本&#xff1a;7.19.10 ##关闭防火墙&#xff0c;并设置开机自关闭 systemctl stop firewalld.service systemctl disable firewalld.service ##查看防火墙状态 sy…

Spark集群搭建

Spark集群结构 图 名词解释 Driver 该进程调用 Spark 程序的 main 方法&#xff0c;并且启动 SparkContextCluster Manager 该进程负责和外部集群工具打交道&#xff0c;申请或释放集群资源Worker 该进程是一个守护进程&#xff0c;负责启动和管理 ExecutorExecutor 该进程是一…

Linux-故障排查

实验要求 samba仅允许192.168.1.0/24、192.168.10/24进行访问 开一台虚拟机 快照恢复到未联网安装 关闭防火墙 安全linux 编辑ens33网卡 vim /etc/sysconfig/network-scripts/ifcfg-ens33 将ens33网卡复制一份命名为ens37 cp /etc/sysconfig/network-scripts/ifcfg-ens33 /etc…

深度学习课程实验三训练和测试卷积神经网络

一、 实验目的 1、学会搭建、训练和测试卷积神经网络&#xff0c;并掌握其应用。 2、掌握使用numpy实现卷积(CONV)和池化(POOL)层&#xff0c;包括正向春传播和反向传播。 二、 实验步骤 Convolutional Neural Networks: Step by Step 1、导入所需要的安装包 2、构建卷积神经…

Docker安装与仓库使用

日升时奋斗&#xff0c;日落时自省 目录 1、Docker引擎 2、Docker和虚拟机的区别 3、Docker架构 4、Docker安装 4.1、Ubuntu安装 4.1.1、查看版本需求 4.1.2、卸载历史版本 4.1.3、配置docker下载源 4.1.4、自动启动配置 4.1.5、查看docker版本 4.2、CentOS安装 4…

flutter 五:MaterialApp

MaterialApp const MaterialApp({super.key,this.navigatorKey, //导航键this.scaffoldMessengerKey, //scaffold管理this.home, //首页Map<String, WidgetBuilder> this.routes const <String, WidgetBuilder>{}, //路由this.initialRoute, //初始路由th…

WORD交叉引用参考文献批量转上标

试了好几种方法&#xff0c;只有这个对我奏效

卷积神经网络|导入图片

在学习卷积神经网络时&#xff0c;我们通常使用的就是公开的数据集&#xff0c;这里&#xff0c;我们不使用公开数据集&#xff0c;直接导入自己的图片数据&#xff0c;下面&#xff0c;就简单写个程序实现批量图片的导入。 import osfrom PIL import Imageimport numpy as np…

nginx配置图片服务器

目录 一&#xff1a;访问流程 二&#xff1a;缓存服务器配置 三&#xff1a;上传图片直接上传到图片服务器 四&#xff1a;加快图片访问 一&#xff1a;访问流程 访问缓存服务器(上面安装nginx反向代理到图片服务器&#xff0c;对外提供服务)->图片服务器 二&#xff1…

Windows【工具 05】使用freeSSHd搭建sftp环境(安装+配置+避坑)freeSSHd version 1.3.1安装包网盘分享

使用freeSSHd搭建sftp环境 1.安装2. 使用2.1 开启2.2 配置 3.避坑3.1 端口占用3.2 配置数据无法保存或报没有权限 官方网址已经停止维护&#xff0c;网盘文件 freeSSHd.exe版本为 1.3.1: 链接&#xff1a;https://pan.baidu.com/s/1X-4i9pWGKOsCFEByfPXhig?pwdxp6f 提取码&a…

C# xml序列化和反序列化

问题 有的项目使用webservice返回结果是xml&#xff0c;需要进行xml序列化和反序列化 xml序列化相关特性 C#中&#xff0c;XML序列化相关的特性主要包括&#xff1a; XmlIgnore&#xff1a;这个特性可以用来指示序列化过程忽略一个属性或一个字段。当使用XmlIgnore特性时&a…

Windows PowerShell的安全目标——安全警报

Windows PowerShell的安全目标——安全警报 1. 保证Shell安全 ​ 自从2006年年底PowerShell发布以来&#xff0c;微软在安全和脚本方面并没有取得很好的名声。毕竟那个时候&#xff0c;**VBScript和Windows Script Host(WSH)**是两个最流行的病毒和恶意软件的载体&#xff0c…

3D Gaussian Splatting复现

最近3D Gaussian Splatting很火&#xff0c;网上有很多复现过程&#xff0c;大部分都是在Windows上的。Linux上配置环境会方便简单一点&#xff0c;这里记录一下我在Linux上复现的过程。 Windows下的环境配置和编译&#xff0c;建议看这个up主的视频配置&#xff0c;讲解的很细…

SemCms外贸网站商城系统 SQL注入漏洞复现(CVE-2023-50563)

0x01 产品简介 SemCms是国内团队打造的专门针对外贸网站的开源CMS,主要用于外贸企业,兼容IE,Firefox等主流浏览器。建设商城性质的外贸网站,多语言(小语种)网站。 0x02 漏洞概述 SemCms外贸网站商城系统SEMCMS_Function.php 中的 AID 参数存在SQL注入漏洞,未经身份认…

el-autocomplete远程搜索使用及el-upload上传多个文件流给后端,详情接口返回的是文件地址,前端将文件地址转成文件流,回传文件流给后端

最近遇到一个项目,里面有2个需求我觉得挺常见的,第一个需求是一个表单里,当用户在输入名称后,前端调接口发请求获取到关联名称的企业名称,并展示,然后当用户选中企业后,前端调接口获取选中企业的具体信息,并填充到表单里;第二个需求是,表单里有个上传图片的功能,前端…