【Linux】进程间通信(一)---- 匿名管道

【Linux】进程间通信(一)---- 匿名管道

  • 一.序
    • 1什么是进程间通信
    • 2.进程间通信的标准
    • 3.为什么需要进程通信
  • 二.匿名管道
    • 1.原理
    • 2.使用
    • 3.四种情况
    • 4.五个特点

一.序

1什么是进程间通信

进程间通信
通信我们大致知道是啥,就是互相传递信息
那进程间通信,就是进程间相互传递信息了

我们知道信息就是就是数据

我们都知道进程具有独立性
所以我们想要让进程中的一个,将信息直接传递给另一个进程
虽然从理论上讲确实可以,但这样无疑是破坏了进程的独立性

所以操作系统会给在内存中开辟一个公共空间
让这两个进程来进行通信

但是我们想想
进程访问这个空间,进行通信,本质就是访问操作系统
进程对于系统来说就是用户,因为进程是用户来控制的

我们曾经多次提到:操作系统是不会信任用户的
所以操作系统从开辟公共内存到进程的相互通信,都是通过调用系统自己设计的接口来进行的

所以:
一般操作系统会有一个独立的通信模块,隶属于文件系统,叫做IPC通信模块

2.进程间通信的标准

我们知道在计算机行业中,**标准是很重要的,**就像5G的行业标准是华为制定的。

所以为了让不同计算机的不同操作系统的不同文件系统,都能进行通信,所以进程间的通信标准是很重要的。
进程间通信的定制标准system Vposix

3.为什么需要进程通信

1.基本数据
2.发送命令
3.某种协同
4.通知

基于这几种需求,所以创造出了进程通信

其实以前进程间是不会进行通信的
但是人们发现进程通信还挺有必要的
所以进程间通信的产生是历史的必然

二.匿名管道

这个匿名管道就是进程间通信的一种方式,但是也有局限

现在先为大伙带来原理,再带大家来使用

1.原理

这里就得用到博主曾经在FD的图了
在这里插入图片描述
这个是以前在讲文件FD时用到的图

那如果我们这个时候fork一个子进程会怎么样呢

我们知道子进程fork的时候,子进程会获得与父进程相同的虚拟地址空间的副本,使子进程拥有与父进程相同的代码、数据和堆栈。

这个时候看看上面的图:
我们知道这个struct taskstruct files_struct

所以他们也会被子进程进行复制

在这里插入图片描述
我们知道左边的部分是这样被子进程复制的

那么问题来了,右边的打开的文件需不需要被复制呢

在这里插入图片描述

这个答案肯定是否定的,因为右边两个被子进程复制走
因为他们都是父进程的一部分,但是打开的文件就不一样了
因为打开的文件和进程是平级的,并不是与进程的一部分

所以是这样的
在这里插入图片描述

所以,利用这个特性,我们就能来创建我们的匿名管道了

在这里插入图片描述

我们打开一个buffer缓冲区(实际上就是一个内存级文件)

这个时候如果fork一下呢?

在这里插入图片描述

就会变成这样

这个时候其实我们就能发现了,这两个进程已经能进行双向通信了

但是看看我们这个叫啥
匿名管道,管道两个字就注定了,它只进不出

因为如果子进程和父进程都同时进行读和写的话
谁能保证父进程写完,会被父进程读走呢?
所以为了确保通信的稳定性和便于实现性
所以这里就要:
关掉父进程的读或者子进程的写
或者关掉父进程的写或者子进程的读

让它变成单向通信。

在这里插入图片描述
在这里插入图片描述

这里就是匿名管道的原理了

2.使用

这里我们已经把管道的原理给讲明白了
接下来就是使用了

之前提过:操作系统是不会信任用户的
所以操作系统从开辟公共内存到进程的相互通信,都是通过调用系统自己设计的接口来进行的

所以这里就要解释接口了

int pipe(int pipefd[2]);

在这里插入图片描述

pipe是起这个作用的

接下来就带大伙来试一下匿名管道通信

#include<unistd.h>
#include<iostream>
#include <sys/types.h>
#include <sys/wait.h>
#include <cstdio>
#include <cerrno>
using namespace std;
void child_write(int pipefd[2])
{
    const char * buffer="my dad";
    int cnt=2;
    while(cnt--)
    {
       write(pipefd[1],buffer,sizeof(buffer));
       cout<<"write success"<<endl;
    }
    

}
void father_read(int pipefd[2])
{
    char buffer[1024];
    while (true)
    {
        ssize_t bytesRead = read(pipefd[0], buffer, sizeof(buffer) - 1); // 留出一个字节存放字符串结束符
        if (bytesRead == 0)
            break;
        buffer[bytesRead] = '\0'; // 手动添加字符串结束符
        cout << buffer << endl;
    }
}
int main()
{
    int pipefd[2];
    if(pipe(pipefd)==-1)
    {
        perror("pipe失败");
        return 0;
    }
    pid_t id=fork();
    if (id < 0) 
    {
    perror("fork");
    return 1;
    } 
    // 子进程
    else if(id == 0) 
    {
       //这里就实现子进程写,父进程读把
        close(pipefd[0]);
        //子进程读
        child_write(pipefd);
        //写完,关闭通道
        close(pipefd[1]);
    } 
    // 父进程
    else 
    {
        close(pipefd[1]);
        //父进程写
        father_read(pipefd);
    }


        //读完,关闭通道
        close(pipefd[0]);
        
        //回收子进程
        int status;
        if(wait(&status)>0)
        cout<<"wait success\n"<<endl;

}

在这里插入图片描述

这样就完成了通信

3.四种情况

管道的四种情况:
1.读写端正常,管道如果为空,读端就要阻塞
管道没有接受到数据,读端就会一直等待数据

2.读写端正常,管道如果满,写端就要阻塞
管道满了,读端没有读数据,数据就堵在管道了,写端无法继续写

3.写端退出,读端正常,读端读到0,不会阻塞
这是因为读端正常,写端没数据了,这个时候代表是正常读写完成。

4.读端退出,写端正常,会把写端关闭
因为操作系统不让做一些浪费性能的事情,已经没有人读取你的数据了,那你就没有继续写的必要了,系统会自己把写端关闭

4.五个特点

匿名管道的五个特点;

1.管道本质是内存级文件,寿命周期是进程
这个是肯定的,管道本来就是为了通信存在的,父子进程通信完毕,自然也就关闭了

2.管道只能单向通信
这个最前面我们也提到过

3.具有血缘关系(常见的是父子)的进行进程间通信
因为我们利用的就是父子进程fork后复制files struct的原理
其实爷孙进程也可以用,只不过常见的是用在父子而已

4.管道是面向字节流的
这个还不太好解释,之后的博客会有解释

5.父子进程会进程协同,同步与互斥的
这个也不太好解释,之后博客也会进行解释

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

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

相关文章

MySQL 8.4参考手册

5.1 连接到服务器和断开服务器连接 host 和 user 表示主机名&#xff0c;其中 MySQL服务器正在运行&#xff0c;并且您的MySQL帐户的用户名。 为您的设置替换适当的值。代表您的密码;输入它 当 MySQL 显示提示时。********Enter password: 5.2 输入查询 mysql> SELECT VERSI…

哪些软件格式在win跟linux上都能运行?

在开始前我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「linux的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01; 有一些软件格式在Windows和Li…

什么是Google SEO优化,如何做好谷歌seo排名?2024年谷歌搜索引擎优化(谷歌SEO)3分钟速通教程指南

1 - 什么是SEO&#xff1f; 谷歌排名优化&#xff08;SEO&#xff1a;Search Engine Optimization&#xff09;是指当您在谷歌搜索那里输入一个您正在推广的产品或服务的关键词时&#xff0c;如何在使您的站在Google里获得一个较高的排名位置而做的优化过程。谷歌排名优化的意…

第二证券资讯:多模态AI应用提速 机构扎堆调研相关个股

当地时间5月13日&#xff0c;OpenAI发布一款名为GPT-4o的新旗舰生成式AI模型&#xff0c;并计划在接下来的几周内“迭代”推出到公司产品中。 据介绍&#xff0c;GPT-4o的文本、推理、编码才能到达GPT-4 Turbo水平&#xff0c;速度是上一代AI大模型GPT-4 Turbo的两倍&#xff…

短视频世上无人再似她:成都鼎茂宏升文化传媒公司

短视频世上无人再似她 —— 记忆中的光影传奇 在短视频盛行的今天&#xff0c;每一位创作者都在用镜头捕捉生活&#xff0c;记录世界&#xff0c;但有那么一位艺术家&#xff0c;她的作品如同夜空中最亮的星&#xff0c;即便是在信息洪流中&#xff0c;也依然闪耀着独一无二的…

javaSE:类和对象

面向对象 java是一种面向对象的编程语言&#xff0c;面向对象就是把能为我们所用的东西直接拿来使用&#xff0c;省去中间过程&#xff0c;比如洗衣服&#xff0c;要完成这一个动作&#xff0c;我们本来需要一个盆&#xff0c;放水&#xff0c;放衣服&#xff0c;换水&#xf…

使用 cloudflare 免费服务,搭建临时邮箱,无需暴露自己的真实邮箱地址,保护个人隐私

使用 cloudflare 免费服务&#xff0c;搭建临时邮箱 地址 在线演示 &#x1f310;Github地址 https://github.com/find-xposed-magisk/cloudflare_temp_email 功能/TODO Cloudflare D1 作为数据库 使用 Cloudflare Pages 部署前端 使用 Cloudflare Workers 部署后端 email 转…

一文讲懂“预测滞后性”:详细解析

当我们谈论预测时&#xff0c;经常会遇到一个现象叫做“预测滞后性”。简单来说&#xff0c;预测滞后性指的是预测结果往往落后于实际发生的事件。这可能是由于数据收集、模型训练、预测算法的时间延迟&#xff0c;或者是由于预测模型本身的特性导致的。 目录 一、预测滞后性的…

Google I/O 2024:有关AI的一切已公布|TodayAI

2024年谷歌I/O大会圆满落幕&#xff0c;谷歌在会上发布了一系列更新&#xff0c;涵盖从最新的人工智能技术到Android系统的多项改进。此次大会特别关注于谷歌的Gemini人工智能模型&#xff0c;并详细介绍了这些模型如何被融入到Workspace、Chrome等多个应用程序中&#xff0c;展…

IT行业现状与未来趋势分析

IT行业现状与未来趋势显示出持续的活力和变革&#xff0c;以下是上大学网&#xff08;www.sdaxue.com&#xff09;关于IT行业现状与未来趋势分析&#xff0c;供大家参考。 当前现状&#xff1a; 市场需求持续增长&#xff1a;随着信息时代的深入发展&#xff0c;各行各业对信息…

汽车电子笔记之-012:旋变工作原理及软解码硬解码

目录 1、旋变 1.1、激励的产生 1.2、旋变的标定 2、旋变解码 2.1、旋变硬解码 2.2、软解码 1、旋变 旋转变压器&#xff08;旋变&#xff09;&#xff0c;是电机控制中常用的一种位置传感器&#xff0c;用来反应电机的转子位置&#xff0c;提供给软件做电机控制等相关算法…

Nginx+Keepalived高可用集群

NginxKeepalived高可用集群 服务器准备 服务器名IP软件包主从n1RIP 192.168.99.111 VIP 192.168.99.200nginx keepaliveMASTERn2RIP192.168.99.122 VIP 192.168.99.200nginx keepalivedh1RIP 192.168.99.133 VIP 192.168.99.200httpdh2RIP 192.168.32.144 VIP 192.168.99.200h…

三.Ubuntu安装MySql数据库

三.Ubuntu安装MySql数据库 1.首先进入Console,登录Ubuntu系统后,更新源,命令:apt update,如图所示。 安装MySQL命令:apt install mysql-server 执行期间按回车,进行下一步,执行过程如图所示: 选择yes或no,此步选择yes 安装完成。 2.提高MySQL安全性,该命令…

2024-简单点-MediaCrawler解构

MediaCrawler var.pyrecv_sms.pyasync_db.pydb.pymain.pybase/base_crawler.pyconfig/baseconfig.pyconfig/db_config.py有待更新 var.py from asyncio.tasks import Task from contextvars import ContextVar from typing import Listimport aiomysqlfrom async_db import As…

【脚本】使用脚本备份docker中部署的mysql数据库

v1版本明文密码方式&#xff1a; #!/bin/bash# 定义 MySQL 容器名称和数据库信息 container_name"mysql_container" db_user"root" db_password"your_password"# 定义要备份的数据库列表 databases("database1" "database2"…

交换机组网最常见的8大故障及解决方式

有朋友多次提到网络故障&#xff0c;其中在交换机组网时常见的故障比较多&#xff0c;为了便于大家排除这些故障&#xff0c;在此介绍一些常见的典型故障案例及处理思路。 故障1&#xff1a;交换机刚加电时网络无法通信 【故障现象】 交换机刚刚开启的时候无法连接至其他网络…

摸鱼大数据——Linux搭建大数据环境(安装zooKeeper和zookeeper shell命令)五

安装zookeeper软件 1.上传软件 使用CRT等客户端远程上传 zookeeper-3.4.6.tar.gz 文件到/export/software目录下 2.解压软件 [rootnode1 ~]# cd /export/software/ [rootnode1 software]# tar -xzvf zookeeper-3.4.6.tar.gz -C /export/server/ [rootnode1 software]# cd /ex…

用友GRP-U8 userInfoWeb SQL注入致RCE漏洞复现 (XVE-2024-10539)

0x01 产品简介 用友GRP-U8R10行政事业内控管理软件是用友公司专注于国家电子政务事业,基于云计算技术所推出的新一代产品,是我国行政事业财务领域最专业的政府财务管理软件。 0x02 漏洞概述 用友GRP-U8R10行政事业内控管理软件 userInfoWeb接口处存在SQL注入漏洞,未授权的…

自由职业是种怎样的体验?普通人如何成为一名自由职业者?

自由职业在哪都能办公自由职业在哪都要办公。 放弃幻想&#xff0c;没有不辛苦的工作&#xff0c;5年经验后端开发程序员&#xff0c;已经从事自由职业1年半&#xff0c;今天就来客观分享一下自由职业的利与弊。 时间自由&#xff0c;减少中间商赚差价 自由职业最让人羡慕的就…

电机完美控制的感觉如何【应用案例】

当电机控制技术成为人体的一部分时&#xff0c;对控制系统的组件尺寸和可靠性要求将极大提高。得益于集成式FOC控制系统组件&#xff0c;第一款具有两个活动关节的义肢得以在短时间内完成—— 赶上在苏黎世举办的全球半机械人奥运会(Cybathlon)。 失去肢体显然会对一个人的生活…