Linux 进程通信

1.什么是进程通信?

答:两个或多个进程实现数据层面的交互;但是因为进程的独立性,导致进程通信的成本较高;

2.为什么要通信?

答:多进程之间由协同的需求,所以通信;以下是通信要实现的目的:

2.1.基本数据:

2.2.发送命令:一个进程控制另一个进程

2.3.多进程之间实现协同

2.4.通知

2.6.通信是有成本的:因为是要打破进程的独立性

3.怎么通信?

3.1进程间通信的本质:必须让不同的进程看到同一份“资源”

3.2“资源”——特定形式的内存空间;

3.3这个资源谁提供?答:一般是操作系统提供;

3.4为什么不是我们两个进程中的一个提供呢?答:进程具有独立性;假设是由一个进程提供,这个资源应该属于谁?他不是共享资源,还是进程独有,因为破环了进程的独立性;OS是第三方空间,谁用谁申请

3.5进程访问这个空间,进行通信,本质就是访问操作系统;进程代表的就是用户;“资源”从创建、使用、释放——必须调用系统接口;

3.6操作系统提供资源,保障了进程通信,而且底层设计、接口设计、都要由操作系统独立设计;一般操作系统,会有一个独立的通信模块——隶属于文件系统——IPC通信模块(进程间通信的意思)

3.7进程间通信是由标准的;两套标准——system V  和 posix

3.8基于文件级别的通信方式——管道(此时的文件,只是代称,我可以往内存中写啊)

思想是正确的,但是效率并不高;管道是Linux(unix)最古老的进程通信方式;

3.9管道原理(自我理解):基础IO部分,缓冲区里的数据要写入磁盘文件,现在不写入磁盘,而是直接与子进程交互,把数据给子进程;并且通过引用计数原理(智能指针)控制着文件的打开和关闭,进行读写;(只能单向通信所以命名为管道)

3.10强烈建议如果单向通信,一定要关闭不必要的文件描述符,防止写错;

3.11 如果我要进行双向通信呢——答:建两个管道;

3.12 以上讲的是父子进程,如果没有任何关系,可以用以上讲的原理进行通信吗?答:不能,做不到;

3.13兄弟之间也可以用管道,进行通信;爷爷和孙子也可以进行通信——使用管道通信,必须得是具有血缘关系;常用于父子之间

3.14 以上所说的文件,是在缓冲区中进行的,并不是在真实的文件中交互的,所以这个管道叫做匿名管道!

4.接口

4.1open、close是磁盘级的接口,不能用他,而是专用的接口pipe(系统接口)

 int pipe(int pipefd[2]);//pipdfd[2]  输出型参数
//pipefd[0]  只读下标 
//pipefd[1]  只写下标

4.2代码实现管道

// 实现系统间通信
#include <iostream>
#include <unistd.h>
#include <string>
#include <cstdlib> //stdlib.h C++风格的头文件写法
#include <sys/types.h>
#include <sys/wait.h>using namespace std;#defind N 2
#define NUM 1024
void Writer(int wfd)
{string s = "hello,i am child!";pid_t self = getpid();int number = 0;char buffer[NUM];while (true){//构建字符串buffer[0] = 0; // 字符串清空;只是为了提醒阅读代码的人,我把这个数组当作字符串了snprintf(buffer, sizeof(buffer), "%s-%d-%d", s.c_str(), self, number);//cout<<buffer<<endl;       //发送给父进程write(wfd,buffer,strlen(buffer));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; //0=='\0'cout<<"father get a message["<<getpid()<<"]#"<<buffer<<endl;}}
}
int main()
{int pipefd[N] = {0};int n = pipe(pipefd); // 0下标是读;1下标是写if (n < 0){perror("pipe");return 1;}// cout<<"pipefd[0]:"<<pipefd[0]<<",pipefd[1]:"<<pipefd[1]<<endl;// 子进程写入,父进程读pid_t id = fork();if (id < 0)return 2;if (id == 0){// 子进程close(pipefd[0]);Writer(pipefd[1]);close(pipefd[1]);exit(0);}close(pipefd[1]);Reader(pipefd[1]);pid_t rid = waitpid(id, nullptr, 0);if (rid < 0)return 3;close(pipefd[0]);return 0;
}

4.3根据以上代码可以得到管道的本质:将上层缓冲区的数据拷贝到系统缓冲区,再将数据拷贝给上层缓冲区;

4.4进程间通信的本质:需要让不同的进程,看到同一份资源——但是是多执行流共享的,难免会出现访问冲突的问题;

5.管道的特征:五点

5.1具有血缘关系的进程进行进程间通信;

5.2管道只能单向通信;

5.3父子进程是会进程协同的,同步与互斥的——保护管道文件的数据安全;

5.4管道是面向字节流的;

5.5管道是基于文件的,文件的生命周期是跟随进程的(父子进程退出,管道会被操作系统回收)

6.管道的4种情况:

6.0管道是有大小的,Linux版本2.6.11之前是4KB,之后是64KB;(为了保障传输数据的整体性,有序性,定义了一个pipe_buf 大小是4KB,当写入系统缓冲区的数据小于4KB时,必须要等子进程传输完数据,父进程才能读——这个工作就是读取的原子性问题)

6.1读写端正常,管道如果为空,读端就要阻塞;

6.2读写端正常,管道如果被写满,写端就要阻塞

6.3读端正常,写端关闭,读端就会读到0,表明读到了文件(pipe)结尾,不会被阻塞;一直在读;

6.4读端关闭,写端正常,操作系统就要杀掉这个正在写入的进程;如何干掉?答:操作系统通过信号(是几号信号? 答:13号)干掉(操作系统是不会做低效,浪费等类似的工作的,如果做了,那就是操作系统的bug)

ulimit -a //查看系统对一些非常重要的资源的限制

7.管道的应用场景

7.1这个管道和我们以前学的知识,哪些是有关系的?

Linux shell 指令 :cat test.txt | head -10 |tail -5  这个语句的实现,就是shell命令+进程替换+管道实现的;

7.2使用管道实现一个简易版本的进程池;(请看下一节)

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

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

相关文章

Java常用对象的快速初始化

在Java中&#xff0c;有多种方式来快速初始化各种常用对象&#xff0c;如字符串数组&#xff08;String[]&#xff09;&#xff0c;集合列表&#xff08;List&#xff09;&#xff0c;映射表&#xff08;Map&#xff09;&#xff0c;以及集合&#xff08;Set&#xff09;。不同…

动态服务管理的艺术:Eureka在服务扩展与收缩中的策略

动态服务管理的艺术&#xff1a;Eureka在服务扩展与收缩中的策略 在微服务架构中&#xff0c;服务的动态扩展和收缩是实现高可用性和弹性的关键。Eureka&#xff0c;作为Netflix开源的服务发现框架&#xff0c;提供了一套机制来处理服务实例的动态变化。本文将深入探讨Eureka如…

在操作系统中,background通常指的是运行于后台的进程或任务

在计算机中&#xff0c;"background"一词具有多种含义&#xff0c;以下是一些主要的解释和相关信息&#xff1a; 计算机视觉中的背景&#xff08;Background&#xff09;&#xff1a; 在计算机视觉中&#xff0c;background指的是图像或视频中的背景部分&#xff0c;…

[code snippet] 生成随机大文件

[code snippet] 生成随机大文件 一个无聊的测试代码&#xff0c;因为要测试大文件的网络传输&#xff0c;就写了一个随机大文件生成脚本&#xff0c;做个备份。 基本上都是 GPT 生成的&#xff0c;哈哈。 C# 代码 namespace ConsolePlayground;internal class BigFileGenera…

IOS17闪退问题Assertion failure in void _UIGraphicsBeginImageContextWithOptions

最近项目更新到最新版本IOS17&#xff0c;发现一个以前的页面突然闪退了。原来是IOS17下&#xff0c;这个方法 UIGraphicsBeginImageContext(CGSize size) 已经被移除&#xff0c;原参数如果size为0的话&#xff0c;会出现闪退现象。 根据说明&#xff0c;上述方法已经被替换…

【shell脚本速成】python安装脚本

文章目录 案例需求应用场景解决问题脚本思路案例代码 &#x1f308;你好呀&#xff01;我是 山顶风景独好 &#x1f388;欢迎踏入我的博客世界&#xff0c;能与您在此邂逅&#xff0c;真是缘分使然&#xff01;&#x1f60a; &#x1f338;愿您在此停留的每一刻&#xff0c;都沐…

React 中 useEffect

React 中 useEffect 是副作用函数&#xff0c;副作用函数通常是处理外围系统交互的逻辑。那么 useEffect 是怎处理的呢&#xff1f;React 组件都是纯函数&#xff0c;需要将副作用的逻辑通过副作用函数抽离出去&#xff0c;也就是副作用函数是不影响函数组件的返回值的。例如&a…

vue中如何使用echarts和echarts-gl实现三维折线图

一、vue中使用三维折线图 效果图&#xff1a; 二、使用步骤 1.引入库 安装echarts 在package.json文件中添加 "dependencies": {"echarts": "^5.1.2""echarts-gl": "^1.1.1",// "echarts-gl": "^2.0.8…

5G超宽,远程诊疗带来优质就医体验

上篇&#xff08;5G与4G的区别-CSDN博客&#xff09;讲了4G与5G的区别&#xff0c;大家可以看到5G 具备高带宽、低时延的特性&#xff0c;可以广泛应用在各种物联网场景下。 今天和大家简单聊聊5G远程诊疗。 远程诊疗是一种利用信息通信技术为患者提供医疗服务的方式。它允许…

掌握PoE交换机的潜力:全面的以太网供电连接手册

在数字化日益成为我们生活和工作核心的今天&#xff0c;一个稳固且效率高的网络基础架构对于个人和企业来说是不可或缺的。PoE&#xff08;以太网供电&#xff09;交换机作为一种创新技术&#xff0c;通过单一的网络线缆同时传递数据和电源&#xff0c;对于增强网络的性能起着关…

5. Spring IoCDI ★ ✔

5. Spring IoC&DI 1. IoC & DI ⼊⻔1.1 Spring 是什么&#xff1f;★ &#xff08;Spring 是包含了众多⼯具⽅法的 IoC 容器&#xff09;1.1.1 什么是容器&#xff1f;1.1.2 什么是 IoC&#xff1f;★ &#xff08;IoC: Inversion of Control (控制反转)&#xff09;总…

都江堰操作系统(DJYOS)和安卓操作系统(Android)的区别

- 开发团队&#xff1a;都江堰操作系统由深圳市秦简计算机系统有限公司开发和运营&#xff1b;而安卓由谷歌及其他公司带领的开放手机联盟开发。 - 开源情况&#xff1a;都江堰操作系统是开源操作系统&#xff0c;采取了类BSD许可证&#xff1b;安卓是基于Linux的开放源代码软…

AGI大模型的门槛是什么?怎么学

AGI&#xff08;Artificial General Intelligence&#xff0c;通用人工智能&#xff09;大模型&#xff0c;即具备类似人类智能的、能够理解、学习、应用知识和技能并解决各种复杂问题的通用型人工智能模型&#xff0c;目前仍然是人工智能研究的前沿领域&#xff0c;具有以下门…

深度学习 --- stanford cs231学习笔记七(训练神经网络之梯度下降优化器)

5&#xff0c;梯度下降优化器 5&#xff0c;1 梯度下降在深度学习中的作用 在深度学习中&#xff0c;权重W的值是否合理是由损失函数L来判断的。L越小&#xff0c;表示W的设置越happy。L越大&#xff0c;表示W的值越unhappy。 为了让L越来越小&#xff0c;常用的方法是梯度下降…

centos7安装zabbix6.4-mysql8

CentOS 7 安装 Zabbix 6.4 步骤 关闭防火墙和服务 systemctl stop firewalld.service setenforce 0安装 MySQL 配置 MySQL 源 wget https://dev.mysql.com/get/mysql80-community-release-el7-5.noarch.rpm yum -y install mysql80-community-release-el7-5.noarch.rpm安装 M…

句法分析概述

第1关&#xff1a;句法分析概述 任务描述 本关任务&#xff1a;通过对句法分析基本概念的学习&#xff0c;完成相应的选择题。 相关知识 为了完成本关任务&#xff0c;你需要掌握&#xff1a; 句法分析的基础概念&#xff1b; 句法分析的数据集和评测方法。 句法分析简介…

应用及安全

目录 一、PAM 安全认证及配置 1.1配置 su 命令的认证 1.2PAM 配置文件结构二、账号和密码安全管理 2.1账号管理 2.2系统账号清理 2.3密码安全控制 2.4密码重设示例 2.5参考命令三、命令历史限制 3.1设置命令历史记录…

【问chatgpt】

这采用的是什么脚手架初始化的&#xff1f;这样问询chatgpt 从文件结构来看&#xff0c;这个项目很可能是使用 Express 框架初始化的。这些文件夹和命名约定常见于 Express 项目结构&#xff0c;特别是&#xff1a; controllers: 控制器文件夹&#xff0c;通常用于处理请求逻…

同城小商城货到付款系统源码小程序

&#xff1a;便捷购物新选择 &#x1f680; 一、快速便捷&#xff0c;同城直达 在这个快节奏的时代&#xff0c;时间就是金钱。你是否曾因为等待快递而焦虑不安&#xff1f;现在&#xff0c;有了“同城商城货到付款小程序”&#xff0c;这一切都变得不再是问题。它专注于同城…

<商务世界>《79 微课堂 <客户是核心:2 客户沟通的技巧《扬长避短进行沟通》(全文原创首发)>》

1 说明 符合表示★关键信息▲必要信息●一般信息 2 规则 等级信息★1、无准备&#xff0c;不沟通。▲2、做最准备充分&#xff0c;准备不设上限★3、掌握自己的节奏&#xff0c;不在他人节参中被动●4、准备充分、心态平稳、扬长避短。●5、沟通就是对消息的处理。发送、接收…