进程间通信--管道

一、为什么要有进程间通信(目的)

数据传输:一个进程需要将它的数据发送给另一个进程
资源共享:多个进程之间共享同样的资源。
通知事件:一个进程需要向另一个或一组进程发送消息,通知它(它们)发生了某种事件(如进程终止时要通知父进程)。
进程控制:有些进程希望完全控制另一个进程的执行(如Debug进程),此时控制进程希望能够拦截另一个进程的所有陷入和异常,并能够及时知道它的状态改变

二、怎样做到进程间通信?

无论是发送数据,还是共享数据或协同、控制

进程间通信的本质:是让不同的进程看到同一份资源

为了不破坏进程的独立性,这份资源不属于任何一个进程,而是由OS提供的一块特定形式的内存空间。

进程(用户)利用该空间进行通信,本质上就是访问OS。该空间的建立、释放,底层设计和接口都由OS来完成。

而管道是一种基于文件级别(不与磁盘交互)的通信方式。

三、匿名管道

1、匿名管道的原理/如何建立通信

如图所示,父子进程(有血缘关系的进程)通过继承体系,继承Task_struct的文件描述符表

父进程以WR方式打开该文件,引用计数为2,fork创建子进程,引用计数变为4.

思考:通信时产生的  访问冲突,临界资源竞争

OS在设计上为了简化整个过程,采用了单向通信的模式,即一个读,另一个写。

为实现双向通信,可以再创建一个管道,让通信方向相反即可。

2、打开管道的系统调用接口pipe

输出型参数  pipefd[0]  pipefd[1]分别为读写的fd。

例子:子进程sleep(1),父一直read

#define N 2
#define NUM 128
void Writer(int wfd)
{
    string str = "I am a child ";
    pid_t self = getpid();
    int number=0;

    //充当缓冲区
    char buffer[NUM];
    while(true)
    {
        //字符串清空,只是为了提醒阅读代码的人,把这个数组当成字符串了
        buffer[0]=0;

        snprintf(buffer,sizeof(buffer),"msg:%s--pid:%d--num:%d",str.c_str(),self,number++);
        write(wfd,buffer,strlen(buffer));//不用+1,系统层面不用加\0
        sleep(1);

    }
}
void Reader(int rfd)
{
    char buffer[NUM];
    while(true)
    {
        buffer[0]=0;
        ssize_t n = read(rfd,buffer,sizeof(buffer));
        if(n>0)
        {
            //读取之后按字符串处理
            buffer[n]='\0';
            printf("father get msg:%s father_pid:%d\n",buffer,getpid());
            // cout << "father get a message[" << getpid() << "]# " << buffer << endl;
        }
        else if(n==0)
        {
            cout<<"father read file done";
        }
        else break;
    }
}
// child--w   father--r
//IPC code
int main()
{
    int pipefd[N] = {0};
    int n = pipe(pipefd);
    if (n < 0)
        return 1;

    // cout<<"pipefd[0]:"<<pipefd[0]<<"  "<<"pipefd[1]:"<<pipefd[1]<<endl;

    pid_t id = fork();
    if (id < 0)
        return 2;
    //先形成单向信道
    if (id == 0)
    {
        // child  关掉3
        // 向4中写入
        close(pipefd[0]);
        Writer(pipefd[1]);

        close(pipefd[1]);
        exit(0);
    }

    // father关掉4
    // 从3中读取
    close(pipefd[1]);
    Reader(pipefd[0]);
    
    int rid = waitpid(id,NULL,0);
    if(rid<0)return 3;
    close(pipefd[0]);
    return 0;
}

3、管道的特点

进程退出,文件都关闭了,管道作为内存级文件也会被OS自动释放

4、管道4种情况

1、如果read完了管道内的所有数据,如果写端没有继续写入数据,那么读取端就只能继续等待。

w:1s写一次   r:读完后,也要等1s

2、如果写端把管道写满了就不能继续写入了。

w:短时间写多次直至写满,等待读取   r:5s读一次,一次读整个缓冲区大小

tips:管道大小

64kb 65536b

读写atomic原子性问题。一次读写的数据作为一个整体的单位 PIPE_BUF为4kb

例如hello world是一体的,不会只读一部分hello

3、如果我关闭了写入端,读取完了管道内的数据,继续读就会返回0,表示读取到了文件的结尾。

子进程退出后,父进程一直read(不阻塞),返回0表示读到文件结尾(多次调用read,每次都返回0,表明读到了文件结尾)

4、写端一直写入,但是把读端关闭,操作系统会直接杀死一直在写入的进程,并且关闭管道,操作系统会通过信号来终止进程13)SIGPIPE

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

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

相关文章

cmake 开 asan 未生效

为什么有的时候 cmake 开 asan 没有生效 当使用CMake构建项目时&#xff0c;启用ASan&#xff08;AddressSanitizer&#xff09;的方式可能因为多种原因而没有生效。以下是一些常见的可能原因和解决方法&#xff1a; 1. 检查编译器和CMake版本&#xff1a;确保您使用的编译器…

一文解码语言模型:语言模型的原理、实战与评估

在本文中&#xff0c;我们深入探讨了语言模型的内部工作机制&#xff0c;从基础模型到大规模的变种&#xff0c;并分析了各种评价指标的优缺点。文章通过代码示例、算法细节和最新研究&#xff0c;提供了一份全面而深入的视角&#xff0c;旨在帮助读者更准确地理解和评估语言模…

功能强大的国产API管理神器 Eolink,亲测好用

前言 大家好&#xff0c;我是小月&#xff0c;今天给大家讲讲最近很火的Eolink&#xff0c;一款功能强大且非常实用的国产 API管理工具。在我们日常的前端、后端开发测试过程中经常会用到API&#xff0c;特别是在大型项目中API管理工具也就必不可少。工欲善其事必先利其器&…

git快速上传代码

① git init&#xff1b; 初始化git&#xff0c;之后在文件夹里有.git文件&#xff0c;这个需要 勾选才能查看。 ② git remote add test myFisrtTest: 测试专用 这里的test是自定义的&#xff0c;myFisrtTest: 测试专用 是远程仓库 ③ git branch -a 这里是查看分支 ④ …

Git推送本地代码到远程仓库

Git推送本地代码到远程仓库 1、首先需要安装Git&#xff0c;如果已经安装&#xff0c;请跳过。下载地址&#xff1a;https://git-for-windows.github.io/ 2、安装好git服务器后。首先找到你项目的文件夹&#xff0c;比如项目名称为Item&#xff0c;进入到这个文件夹&#xff0…

%与floormod方法区别

%求余数 计算步骤&#xff1a; 10 / -3 -3.333333........... %是向0方向取整&#xff0c;因此-3.3333.......取整数-3 10 % -3 10-&#xff08;-3*-3&#xff09; 1 floormod方法 计算步骤&#xff1a;floormod(10,-3) floormod是向负无穷方向取整&#xff0c;因此-3…

Java数据结构

Java 数据结构 数据结构主要包括以下几种接口和类&#xff1a; 枚举&#xff08;Enumeration&#xff09; 接口定义了一种从数据结构中取回连续元素的方式。 nextElement 的方法&#xff0c;该方法用来得到一个包含多元素的数据结构的下一个元素。 位集合&#xff08;BitSet…

嵌入式行业算青春饭吗?

今日话题&#xff0c;嵌入式行业算青春饭吗&#xff1f;嵌入式行业的技术要求确实非常广泛&#xff0c;需要深厚的知识广度和深度。这意味着入行门槛较高&#xff0c;我们需要了解不仅是软件和硬件&#xff0c;还要熟悉底层接口和硬件信号的处理方式&#xff0c;了解数据在计算…

kube-bench-CIS基准的自动化扫描工具学习

仓库地址&#xff1a;GitHub - aquasecurity/kube-bench: Checks whether Kubernetes is deployed according to security best practices as defined in the CIS Kubernetes Benchmark kube-bench,检查 Kubernetes 是否根据 CIS Kubernetes 基准中定义的安全最佳实践部署,下载…

基于51单片机PCF8591数字电压表数码管显示设计( proteus仿真+程序+设计报告+讲解视频)

PCF8591数字电压表数码管显示 1.主要功能&#xff1a;讲解视频&#xff1a;2.仿真3. 程序代码4. 设计报告5. 设计资料内容清单&&下载链接资料下载链接&#xff08;可点击&#xff09;&#xff1a; 基于51单片机PCF8591数字电压表数码管设计( proteus仿真程序设计报告讲…

【每日一题】阈值距离内邻居最少的城市

文章目录 Tag题目来源题目解读解题思路方法一&#xff1a;多源最短路 写在最后 Tag 【多源最短路】【数组】【2023-11-14】 题目来源 1334. 阈值距离内邻居最少的城市 题目解读 题目翻译过来是这样的&#xff1a;一共 n 个城市&#xff0c;统计在每个城市 dt 距离范围内所有…

Linux必备基础命令,JAVA程序员必备

目录 一、了解基本的左侧栏什么意思​编辑 二、ls&#xff0c;ll&#xff08;list&#xff0c;查找目录内容) 三、cd(change directory&#xff0c;切换目录) 小技巧&#xff0c;我们在查找东西的时候&#xff0c;可以使用tab进行智能补全。 四、touch&#xff08;建立文件…

R程序 示例4.3.2版本包 在centos进行编译部署

为了在CentOS上下载和编译R语言4.3.2包&#xff0c;可以按照以下步骤进行操作&#xff1a; 1.首先&#xff0c;需要安装一些必要的依赖项。可以使用以下命令安装它们&#xff1a; sudo yum install -y epel-release sudo yum install -y gcc gcc-c gcc-gfortran readline-dev…

C#使用时序数据库 InfluxDB

一、安装 https://docs.influxdata.com/influxdb/v2/install/?tWindows 解压后使用cmd运行 访问 localhost:8086 配置 第一次登入会初始化 配置登入账号 保存TOKEN 这个TOKEN用于后期代码链接访问数据库&#xff0c;忘记了只能删除重新生成 点击QUCK START进入管理页面 …

原神助手 一款支持祈愿分析、查看便签状态和获取游戏详细数据的开源工具。

原神助手 「原神助手」支持祈愿分析、查看便签状态和获取游戏详细数据等。 如何获取祈愿链接 如果你是在 Windows 平台上游玩原神并且当前使用的电脑上安装了原神&#xff0c;那么你可以&#xff1a; 打开原神&#xff0c;进入祈愿页面&#xff0c;点击历史记录&#xff0c;…

SQLite3 数据库学习(一):数据库和 SQLite 基础

参考引用 SQL 必知必会SQLite 权威指南&#xff08;第二版&#xff09;关系型数据库概述 1. 数据库基础 1.1 什么是数据库 数据库&#xff08;database&#xff09;&#xff1a;保存有组织的数据的容器&#xff08;通常是一个文件或一组文件&#xff09; 可以将其想象为一个文…

WebMvcConfigurer配置详解

一、简介 WebMvcConfigurer配置类其实是Spring内部的一种配置方式&#xff0c;采用JavaBean的形式来代替传统的xml配置文件形式进行针对框架个性化定制&#xff0c;可以自定义一些Handler&#xff0c;Interceptor&#xff0c;ViewResolver&#xff0c;MessageConverter。基于ja…

MongoDB入门级别教程全(Windows版,保姆级教程)

下载mongodb 进入官网&#xff1a; Download MongoDB Community Server | MongoDB 选择msi&#xff0c;Windows版本 下载完后直接双击&#xff1a; 选择complete 这里建议改地方&#xff1a; 我这里直接改成d盘&#xff1a;work目录下面&#xff1a; 点击next&#xff1a; 因…

【04】Istio的pilot流量分发机制

4.1 Pilot配置分发机制 Pilot负责网格数据平面相关配置信息的获取&#xff0c;生成&#xff0c;和分发&#xff0c;它通过Service Registry获取网格配置信息并将其转换为XDS接口的标准数据格式&#xff0c;而后经gRPC分发至相关的Envoy; Service Registry&#xff1a;服务注册表…

ARPG----C++学习记录05 Section10 武器类,IK重定向,装备和捡起武器,动画蓝图

代码更新 11.13 BAOfanTing/ARPG_Game_Code7ab54d2 GitHub 武器类 基于item类&#xff0c;创建一个weapon的C类&#xff0c;基于它创建一个蓝图&#xff0c;刀剑的网格体给它。在蓝图里调动之前在C写好的sin函数添加到世界偏移量里&#xff0c;得到一把悬浮刀 在item把重叠函…