【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.父子进程会进程协同,同步与互斥的
这个也不太好解释,之后博客也会进行解释

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

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

相关文章

pcdn边缘云常见sla有哪些?如何避免被白嫖

PCDN&#xff08;Point-to-Point Content Delivery Network&#xff09;边缘云常见的SLA&#xff08;Service Level Agreement&#xff09;规则包括高峰期离线、服务时间、重传延时、限速等。这些规则是为了保证服务质量和用户体验。下面将详细解释这些规则&#xff0c;并提供一…

win10共享文件夹到ubuntu22

win10共享文件夹 新建用户 新建用户、设置密码。避免共享给EveryOne&#xff0c;导致隐私问题。 点击左下角的开始菜单&#xff0c;选择“设置”&#xff08;WinI&#xff09;打开设置窗口。在设置窗口中&#xff0c;搜索或直接点击“账户”进入账户设置。在账户设置中&…

2024 年 11 款顶级Android数据恢复软件的主要功能

Android 设备上的数据丢失可能是一种令人痛苦的体验&#xff0c;通常会导致不可替代的信息瞬间消失。 可能会发生意外删除、系统崩溃或格式错误&#xff0c;关键数据的丢失可能会扰乱日常工作并影响您的工作效率。 幸运的是&#xff0c;技术进步带来了几种恢复解决方案&#…

Google IO 2024有哪些看点呢?

有了 24 小时前 OpenAI 用 GPT-4o 带来的炸场之后&#xff0c;今年的 Google I/O 还未开始&#xff0c;似乎就被架在了一个相当尴尬的地位&#xff0c;即使每个人都知道 Google 将发布足够多的新 AI 内容&#xff0c;但有了 GPT-4o 的珠玉在前&#xff0c;即使是 Google 也不得…

网易云如何改ip地址到另外城市

在数字化时代&#xff0c;网络音乐平台已经成为我们日常生活中不可或缺的一部分。然而&#xff0c;有时候我们可能会因为某些原因想要改变自己的IP地址&#xff0c;网易云音乐作为国内领先的音乐平台&#xff0c;其强大的功能和丰富的音乐资源吸引了大量用户。那么&#xff0c;…

详解 JuiceFS sync 新功能,选择性同步增强与多场景性能优化

JuiceFS sync 是一个强大的数据同步工具&#xff0c;支持在多种存储系统之间进行并发同步或迁移数据&#xff0c;包括对象存储、JuiceFS、NFS、HDFS、本地文件系统等。此外&#xff0c;该工具还提供了增量同步、模式匹配&#xff08;类似 Rsync&#xff09;、分布式同步等高级功…

每日一题:最大加号标志

在一个 n x n 的矩阵 grid 中&#xff0c;除了在数组 mines 中给出的元素为 0&#xff0c;其他每个元素都为 1。mines[i] [xi, yi]表示 grid[xi][yi] 0 返回 grid 中包含 1 的最大的 轴对齐 加号标志的阶数 。如果未找到加号标志&#xff0c;则返回 0 。 一个 k 阶由 1 组…

数字化应用标杆 | 又两家成套厂效率翻倍,利用率高达93%以上!

利驰 联能 & 利驰 俊郎 近日&#xff0c;利驰数字科技&#xff08;苏州&#xff09;有限公司&#xff08;简称利驰软件&#xff09;成功与俊郎电气有限公司&#xff08;简称俊郎电气&#xff09;、浙江联能电气有限公司&#xff08;简称联能电气&#xff09;成功确立了数字…

Google在我的网站显示不同的SEO元标题/描述

Rank Math使您可以比以往更轻松地为您的博客文章、页面和其他自定义帖子类型编写完美的SEO元标题和描述。但正如您可能已经注意到的那样&#xff0c;谷歌&#xff08;以及其他搜索引擎&#xff09;经常不简单地选择使用您设置的元描述&#xff0c;并且这种情况正变得越来越普遍…

深度学习面试问题 | 降维

本文给大家带来的百面算法工程师是深度学习降维面试总结&#xff0c;文章内总结了常见的提问问题&#xff0c;旨在为广大学子模拟出更贴合实际的面试问答场景。在这篇文章中&#xff0c;我们还将介绍一些常见的深度学习面试问题&#xff0c;并提供参考的回答及其理论基础&#…

Capture One 23 Enterprise for Mac/win:专业摄影师的得力助手

在数字图像处理的世界中&#xff0c;Capture One 23 Enterprise无疑是一款引领潮流的专业软件。无论你是专业摄影师&#xff0c;还是摄影爱好者&#xff0c;它都能为你提供全面、高效的图片编辑和管理解决方案。 Capture One 23 Enterprise以其强大的图像编辑功能而著称。它提…

【微积分】三角函数求导积分公式的巧妙记忆

三角函数积分求导公式的巧妙记忆 图像的整体记忆&#xff1a; 上面是sinx cosx 下面也是s开头&#xff0c;secx&#xff0c;cscx 中间是tanx cotx 解释说明&#xff1a; 1️⃣ 对角线互为倒数&#xff0c;即sinx对角线是cscx&#xff0c;这样我们可以更好记住这个六边形图像。…

实战| 手把手教你实现俯卧撑实时计数:OpenCV+MediaPipe

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

【Web】HNCTF 2024 题解(部分)

目录 Please_RCE_Me ezFlask GoJava ez_tp GPTS Please_RCE_Me <?php if($_GET[moran] flag){highlight_file(__FILE__);if(isset($_POST[task])&&isset($_POST[flag])){$str1 $_POST[task];$str2 $_POST[flag];if(preg_match(/system|eval|assert|call|…

7.学习STL中的string类:版本、组件、构造、操作及应用

目录 1. 什么是STL 2. STL的版本 3. STL的六大组件 1. 为什么学习string类&#xff1f; 1.1 C语言中的字符串 2. 标准库中的string类 2.1 string类(了解) 2.2 string类的常用接口说明 1. string类对象的常见构造 2. string类对象的容量操作 reserve 3. string类对象…

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

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

ue引擎游戏开发笔记(39)——npc的ai设定:追踪玩家以及瞄准

1.需求分析&#xff1a; 实现对npc的击杀和死亡反馈后&#xff0c;下一步需要赋予npc基本的ai&#xff0c;首先就是敌人要能够追踪或者说跟随玩家&#xff0c;这才能为后续npc开枪&#xff0c;对射做好准备&#xff0c;首先实现追踪玩家。 2.操作实现&#xff1a; 1.思路&…

VMware Workstation Pro 和 Fusion Pro 针对个人用户使用免费了

今早看到 VMware by Broadcom 官方博客 VMware Desktop Hypervisor Pro Apps Now Available for Personal Use - VMware Cloud Foundation (VCF) Blog 以及 Learn more about VMware Desktop Hypervisor Products Subscription Model 总结如下&#xff1a; 免费 Player 版本将…

通过C++和libcurl下载网易云音乐音频文件的5个简单步骤

概述 在网络编程中&#xff0c;使用C和libcurl库下载文件是一项常见的任务。网易云音乐作为中国领先的在线音乐服务平台之一&#xff0c;以其丰富的音乐资源、优质的音质和智能推荐系统而广受欢迎。由于其平台提供了大量的正版音乐资源&#xff0c;用户在下载音频文件时可能会…

在浏览器执行js脚本的两种方式

fetch请求get 在浏览器执行http请求,可以使用fetch函数; fetch(“url”).then(response => response.text()) .then(data => console.log(JSON.parse(data)[‘status’])) .catch(error => console.error(error)) 直接返回json数据: fetch(“url”).then(response…