Linux进程间通信

“休息过长就会发霉。”--沃尔特·司各特

在讲述完毕Linux中的基础IO之后,我们要来到Linux中很重要的一个模块,即进程间通信。

目录

1.引入

2.管道

2.1内容

2.2原理

2.3操作

2.3.1匿名管道的创建

2.3.2命名管道的创建

1.引入

进程间通信(ipc)是指:操作系统为用户提供的几种进程间通信方式,让进程之间可以实现通信功能。现在的问题是,进程间为什么不能直接进行通信,而需要操作系统提供通信方式。

这个问题的答案和之前的提到的内容有关,我们知道:进程在访问数据的时候都是通过地址来访问的,然而一个进程中的地址都是虚拟地址,在经过页表映射之后才可以访问实际的物理地址。

因此当一个进程想要给另外一个进程传递数据(进程间通信)的时候,就需要将空间地址传递给对方。但是就接收数据的进程而言,它其中的页表映射内容和发送数据进程的页表内容大相径庭,所以接收数据的进程无法访问到具体的数据地址。

该设计的初衷是让进程具有独立性(稳定)与之伴随着的问题便是:进程间的通信无法直接完成。所以需要操作系统来提供一些相关的进程间通信方式:管道、共享内存、消息队列和信号量

2.管道

2.1内容

管道的作用:用于实现数据(资源)的传输。

管道的特性:半双工通信--可以选择方向的单向通信(同一时间不能既发送数据又接收数据),正如其名,管道里的流水既可以流出也可以流入,但无法同一时间既流出又流入。

管道的本质:内核中的一块缓冲区(内核空间中的内存--由系统进行管理)

管道的分类:

  • 匿名管道:管道没有标识符,无法被其他进程找到,只能做拥有具有亲缘关系的进程间通信;
  • 命名管道:管道具有标识符,能够被其他进程找到,可以做用于同意主句的任意进程间通信。

2.2原理

匿名管道的原理:父进程创建了一个匿名管道之后,会收到匿管道对应的文件描述符,进而可以对匿名管道中的内容做增删查改等基本操作。而当子进程创建出来之后,子进程复制父进程,则会复制到同一个匿名管道的操作句柄,进而也可以对其进行基本的操作。

如此操作之后,则会产生数据交互区,即实现了父子进程间的通信。其中发送数据就是向管道写入数据,接受数据就是从管道读取数据。

不过值得注意的是,刚才有提到管道的“文件描述符”这一名词,这是因为管道本质上是一种特殊的文件,因为Linux中一切皆文件。但是管道并不是传统意义上的磁盘文件,它的本质是内存。

命名管道的原理:本质上也是内核中的一块缓冲区。与匿名管道不同的便是,它在创建的时候有名字,可以用于同一主机上任意进程间通信。其余的原理基本同匿名管道。

2.3操作

2.3.1匿名管道的创建

int pipe(int pipefd[2]);

pipe接口的功能是创建一个匿名管道,并通过参数返回管道的两个操作句柄。其中pipefd是一个具有两个整形元素的数据,内部创建管道会将相关的描述符存储在数据之中。

  • pipefd[0] -- 用于从管道中读取数据;
  • pipefd[1] -- 用于从管道中写入数据。

返回值:创建成功返回0,失败返回-1。注意创建匿名管道之前,一定要在创建子进程之前。

在了解匿名管道的概念和操作之后,我们照旧通过代码来对上述内容进行一个简单的实践。

最后执行上述代码,我们在终端上得到这样的结果:

可以明显的观察到,子进程1对管道写入了数据,子进程2对管道中的数据进行了读取。这样的结果很好的阐明了:管道对于进程间通信的实现方式。

值得注意的是:当管道中的读端被关闭之后,持续向管道写入数据会导致进程崩溃,因为管道能容纳的数据有限,只存不取(只写不读)会产生数据过多,管道无法存储。因此当进程不在读取管道中的数据时,此时向管道写入数据时没有意义的,系统将进程结束--进程崩溃。

而当管道中的写端被关闭之后,则当读取完管道中的数据之后,不会产生阻塞,会返回0。这意味着当我们通过read返回得到0时,说明管道中的数据已经被读取完,无法读取到新的数据了已经。因此,我们也可以通过read的返回值,来决定什么时候停止从管道读取数据。(有些人永远等不来~)

2.3.2命名管道的创建

int mkfifo(const char* pathname, mode_t mode);

mkfifo接口的功能时创建一个命名管道,会依赖pathname参数建立特殊的FIFO文件,mode则是管道文件的访问权限。

创建成功则返回0,失败则返回-1。

照例我来通过代码对命名管道的接口进行实践:

我们向创建一个read_pipe.c文件,其中代码如上图所示,目的是从创建的管道文件中读取数据。

在此之后,我们创建一个write_pipe.c文件,来向管道写入数据,程序内容如上图所示。

生成可执行程序之后,我们复制终端,在两个终端上分别进行读写操作,发现程序运行良好,很好的实现的进程通信的目的。(结果不做展示,望大家自我实践)

值得注意的是,对于命名管道:如果我单独打开两个可执行程序,即只向管道读取数据或是只向管道写入数据会造成阻塞,直到管道被其他任意进程以另一种方式打开,进程才能继续运行。

造成这样结果的原因也十分简单,我们可以从管道的作用来理解,管道本身的作用便是实现进程间通信,若是进程间不存在通信,则会阻塞直到通信开始。这样的设计有助于节省空间,因为当一个管道不同时具备读写(即管道不通信),就没必要为其开辟对应的缓冲区。

除上述讲到的命名管道特性外,匿名管道具有的特性,命名管道都具有。

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

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

相关文章

计讯物联小型水库雨水情测报与大坝安全监测一体化解决方案,确保水库安全运行

方案背景 防洪治理工程是一项重大的民生工程,也是重大的生态工程。基于我国水灾频发的大背景下,小型水库作为防汛抗洪的重要基础设施,其雨水情测报与大坝安全监测是十分有必要的,不仅可为预防水灾、防汛决策提供大量可靠的数据和资…

SpringAMQP

什么是SpringAMQP 官方网址 官方文档https://spring.io/projects/spring-amqp Base Queue 简单队列模型 对于生产者 <!--AMQP依赖&#xff0c;包含RabbitMQ--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boo…

实验6 TensorFlow基础

1. 实验目的 掌握TensorFlow低阶API&#xff0c;能够运用TensorFlow处理数据以及对数据进行运算。 2.实验内容 ①实现张量维度变换&#xff0c;部分采样等&#xff1b; ②实现张量加减乘除、幂指对数运算&#xff1b; ③利用TensorFlow对数据集进行处理。 3.实验过程 题目…

亚马逊测评只能下单上好评?卖家倾向养号测评还有这些骚操作

亚马逊测评这对于绝大部分亚马逊卖家来说都不陌生&#xff0c;如今的亚马逊市场也很多卖家都在用测评科技来打造爆款。不过很多对于亚马逊测评的认知只停留在简单的刷销量&#xff0c;上好评。殊不知亚马逊养号测评还有其它强大的骚操作。 亚马逊自养号测评哪些功能呢&#xf…

Drone+Gitea CICD环境搭建流程笔记

之前没有用过drone&#xff0c;现在公司有用到&#xff0c;看drone.yml配置文件有很多没搞清楚的地方&#xff0c;所以打算自己走一遍配置流程&#xff0c;理清一些概念&#xff0c;这里记下笔记。 为了方便&#xff0c;drone&#xff0c;gitea以及相关软件都是用docker的版本…

Git(四):远程仓库的搭建、获取与更新

目录 1、搭建远程仓库 1.1 github 创建 Repository 2、获取远程仓库 2.1 克隆现有的仓库 2.2 在现有目录中初始化仓库 3、更新提加到仓库 3.1 记录每次更新到仓库 3.2 检查当前文件状态 3.3 跟踪新文件 3.3.1 查看跟踪的文件 3.4 暂存已修改文件 3.5 状态简览 3.6…

redis基础总结-常用命令

redis常用指令3. 常用指令3.1 key 操作分析3.1.1 key应该设计哪些操作&#xff1f;3.1.2 key 基本操作3.1.3 key 扩展操作&#xff08;时效性控制&#xff09;3.1.4 key 扩展操作&#xff08;查询模式&#xff09;3.2 数据库指令3.2.1 key 的重复问题3.2.2 解决方案3.2.3 数据库…

初识C语言 ——“C Primer Plus”

各位CSDN的uu们你们好呀&#xff0c;今天&#xff0c;小雅兰的内容是读一本好书&#xff0c;这一本书的名字就叫做《C Primer Plus》&#xff0c;那么&#xff0c;又回到了我们的初识C语言阶段啦&#xff0c;保证零基础都能看懂噢&#xff0c;下面&#xff0c;让我们进入C语言的…

TOGAF—架构治理

本章为架构治理提供了框架和指南。 3.1 引言 本节介绍治理的性质和治理级别。 3.1.1 企业内部的治理层次 架构治理是管理企业架构和其他架构的实践和方向 并在企业范围内进行控制。 架构治理通常不是孤立运行的&#xff0c;而是在治理结构的层次结构中运行的&#xff0c;它…

leaflet使用L.geoJSON加载文件,参数onEachFeature的使用方法(129)

第129个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+leaflet中加载geojson文件,这里介绍onEachFeature的使用方法。onEachFeature 选项是在将每个功能添加到GeoJSON图层之前调用的功能。使用此选项通常是为了点击某个功能时可以附加弹出窗口。 直接复制下面的 vue+le…

redis set list

Listlist: 插入命令&#xff1a;lpush / rpush 查看list列表所有数据(-1 表示最后一个)&#xff1a;lrange key 0 -1 查看列表长度(key 不存在则长度返回0 ): llen key list长度 获取下表 为 0 的元素 修改下标为0的元素&#xff0c;改为haha 移除列表的第一个元素 或最后一…

一天吃透计算机网络八股文

网络分层结构 计算机网络体系大致分为三种&#xff0c;OSI七层模型、TCP/IP四层模型和五层模型。一般面试的时候考察比较多的是五层模型。最全面的Java面试网站 五层模型&#xff1a;应用层、传输层、网络层、数据链路层、物理层。 应用层&#xff1a;为应用程序提供交互服务…

IDEA2020.1 Failed to execute goal org.codehaus.mojo:exec-maven-plugin

报错内容&#xff1a;Failed to execute goal org.codehaus.mojo:exec-maven-plugin:3.0.0:exec (default-cli) on project leetcode: Command execution failed. 解决&#xff1a;不要勾选

Sentry安装使用(最全最细)

Sentry安装使用(最全最细&#xff0c;包括解决邮箱发送问题&#xff0c;https上传问题&#xff0c;https访问问题&#xff0c;安装此教程配置即可) ##服务器操作系统为2核8G,CentOS7.9 ##安装Docker-ce yum install -y yum-utils \device-mapper-persistent-data \lvm2yum-c…

你是真的“C”——宏与函数的英雄本色

你是真的“C”——宏定义的精髓&#x1f60e;前言&#x1f64c;一、何为宏&#xff1f;#define 定义宏二、宏和函数的对比&#xff1a; &#x1f60a;三、 #undef总结撒花&#x1f49e;&#x1f60e;博客昵称&#xff1a;博客小梦 &#x1f60a;最喜欢的座右铭&#xff1a;全神…

4月11日作业修订

A.这主要看你互斥锁锁的资源是那部分的&#xff0c;如果是进程内资源&#xff0c;则可以实现同一进程不同线程之间的互斥&#xff0c;而如果将共享内存作为互斥锁进行操作则可以实现不同进程之间的互斥。 B.这是必然的&#xff0c;加锁是为了防止数据的二义性 C.信号量同时使…

【Linux】基础IO_文件操作

环境&#xff1a;centos7.6&#xff0c;腾讯云服务器Linux文章都放在了专栏&#xff1a;【Linux】欢迎支持订阅 相关文章推荐&#xff1a; 【Linux】冯.诺依曼体系结构与操作系统 【C/进阶】如何对文件进行读写&#xff08;含二进制&#xff09;操作&#xff1f; 预备知识 在C…

Docker 部署Jira8.1.0

Jira与Confluence一样&#xff0c;都需要用到独立的数据库&#xff0c;对于数据库的安装我们不做介绍&#xff0c;主要介绍如何用Docker部署Jira以及对Jira进行破解的操作。 1、数据库准备 关于数据库官方文档说明&#xff1a;https://confluence.atlassian.com/adminjiraserv…

憨批的语义分割重制版11——Keras 搭建自己的HRNetV2语义分割平台

憨批的语义分割重制版11——Keras 搭建自己的HRNetV2语义分割平台学习前言什么是HRNetV2模型代码下载HRNetV2实现思路一、预测部分1、主干网络介绍a、Section-1b、Section-2c、Section-3d、Section-42、特征整合部分3、利用特征获得预测结果二、训练部分1、训练文件详解2、LOSS…

stm32 esp01s Qt 巴法云平台控制小灯

最近一直在想着用esp01s和stm32做个控制的东西&#xff0c;现在先把现在做好的一部分写出来&#xff0c;巴法云平台我觉得是一个不错物联网平台&#xff0c;接口文档资料都十分清晰。 这个demo是esp1s和stm32串口通信&#xff0c;然后qt上位机和esp01s是tcp通信 这样就可以实现…
最新文章