百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 优雅编程 > 正文

嵌入式Linux系统编程——连进程间通信都不懂,还自称linux大神?

sinye56 2024-11-19 10:45 12 浏览 0 评论

所有学嵌入式Linux系统的看过来了,以下内容是每一位想学习Linux嵌入式系统想要了解的内容,真的很想要分享给大家! 本文分享的内容主要如下几个方面:(绝对的精品资料,不收藏可惜了)

6.1 共享内存

6.1.1 内存模型

6.1.2 共享内存的使用

6.1.3 优点和缺点

6.2 进程信号量

6.2.1 分配与销毁

6.2.2 初始化132

6.2.3 请求与释放

6.3 内存映射

6.3.1 常规文件的映射

6.4 管道

6.4.1 管道创建

6.4.2 父子进程间的通讯方式

6.4.3 重定向 stdin, stdout, stderr

6.4.4 popen 和 pclose

6.5 FIFO

6.5.1 创建 FIFO

6.5.2 访问 FIFO

6.6 Socket


前边分享的文章“进程”中我们讨论了进程的创建方法,也展示了一个进程如何获取子进程的退

出状态。这可以算是最简单的进程间通信方法,但毋庸置疑,它绝不是是最强大的一种。第

七章中所提供的通信机制,对父进程而言,除了通过设置命令行参数和环境变量之外,并没

有提供任何的与子进程通信的方法,同样,对于子进程而言,也只有退出代码这唯一一种向

父进程返回信息的方法。这些通信机制不允许进程与正在运行中的子进程通信,更不可能允

许两个没有派生关系的进程之间自由地对话。

本章介绍的进程间通信机制则完全解除了这些限制。我们将展示供“父子”进程、“无关”进程甚至是分别运行在不同主机的进程之间进行通信的多种方式。

程间通信(Interprocss communication, IPC)是在不同进程之间传递数据的方法。例如,互联网浏览器可以向服务器发送一个请求,随后服务器会传回HTML信息。这样的数据传递通常是通过一种功能类似电话线路连接的套接字来完成的。另外一个例子,你可以用ls | lpr这个命令将一个目录下的文件名打印出来。Shell程序会创建一个ls进程和一个lpr进程,然后用一个“管道(用 | 符号表示)”将它们连接起来。管道为这两个进程提供了一种单向通信的渠道。这个例子中,由ls进程向管道写入信息,而lpr进程则从管道读取。

在本章中,我们将讨论五种不同的进程间通信机制:

? 共享内存允许两个进程通过对特定内存地址的简单读写来完成通信过程

? 映射内存与共享内存的作用相同,不过它需要关联到文件系统中的一个文件上。

? 管道允许从一个进程到另一个关联进程之间的顺序数据传输

? FIFO与管道相似,但是因为FIFO对应于文件系统中的一个文件,无关的进程也可以完成通信。

? 套接字允许无关的进程、甚至是运行在不同主机的进程之间相互通信。

还有一种消息队列,读者可以自己查看Linux的帮助文档。

这些进程间通信机制(IPC)可以按以下标准进行区分:

? 通信对象是否限制为相互关联的进程(即是否有共同的父进程),或者限制为共享同一个文件系统的进程,还是可以为连接到同一个网络中的不同主机上的进程。

? 通信中的一个进程是否限制为仅能读取或者写入数据

? 允许参加通信的进程的总数

? 通信进程是否直接在通信机制(IPC)中得到同步——例如,读取数据的进程会等待直到有数据到达时开始读取。

本章中,我们不再讨论那些只能进行有限次数的进程间通信机制,例如通过子进程的退出代码进行通信的方式等。

6.1 共享内存

共享内存是进程间通信中最简单的方式之一。共享内存允许两个或更多进程访问同一块内存,就如同 malloc() 函数向不同进程返回了指向同一个物理内存区域的指针。当一个进程改变了这块地址中的内容的时候,其它进程都会察觉到这个更改。

因为所有进程共享同一块内存,共享内存在各种进程间通信方式中具有最高的效率。访问共享内存区域和访问进程独有的内存区域一样快,并不需要通过系统调用或者其它需要切入内核的过程来完成。同时它也避免了对数据的各种不必要的复制。

因为系统内核没有对访问共享内存进行同步,你必须提供自己的同步措施。例如,在数据被写入之前不允许进程从共享内存中读取信息、不允许两个进程同时向同一个共享内存地址写入数据等。解决这些问题的常用方法是通过使用信号量进行同步。信号量的使用将在下一节中介绍。不过,我们的程序中只有一个进程访问了共享内存,因此在集中展示了共享内存机制的同时,我们避免了让代码被同步逻辑搞得混乱不堪。

6.1.1 内存模型

要使用一块共享内存,进程必须首先分配它。随后需要访问这个共享内存块的每一个进程都必须将这个共享内存绑定到自己的地址空间中。当完成通信之后,所有进程都将脱离共享内存,并且由一个进程释放该共享内存块。

理解Linux系统内存模型可以有助于解释这个绑定的过程。在Linux系统中,每个进程的虚拟内存是被分为许多页面的。这些内存页面中包含了实际的数据。每个进程都会维护一个从内存地址到虚拟内存页面之间的映射关系。尽管每个进程都有自己的内存地址,不同的进程可以同时将同一个内存页面映射到自己的地址空间中,从而达到共享内存的目的。

分配一个新的共享内存块会创建新的内存页面。因为所有进程都希望共享对同一块内存的访问,只应由一个进程创建一块新的共享内存。再次分配一块已经存在的内存块不会创建新的页面,而只是会返回一个标识该内存块的标识符。一个进程如需使用这个共享内存块,则首先需要将它绑定到自己的地址空间中。这样会创建一个从进程本身虚拟地址到共享页面的映射关系。当对共享内存的使用结束之后,这个映射关系将被删除。当再也没有进程需要使用这个共享内存块的时候,必须有一个(且只能是一个)进程负责释放这个被共享的内存页面。

所有共享内存块的大小都必须是系统页面大小的整数倍。系统页面大小指的是系统中单个内存页面包含的字节数。在 Linux 系统中,内存页面大小是 4KB,不过你仍然应该通过调用 getpagesize 获取这个值。


















相关推荐

程序员:JDK的安装与配置(完整版)_jdk的安装方法

对于Java程序员来说,jdk是必不陌生的一个词。但怎么安装配置jdk,对新手来说确实头疼的一件事情。我这里以jdk10为例,详细的说明讲解了jdk的安装和配置,如果有不明白的小伙伴可以评论区留言哦下...

Linux中安装jdk并配置环境变量_linux jdk安装教程及环境变量配置

一、通过连接工具登录到Linux(我这里使用的Centos7.6版本)服务器连接工具有很多我就不一一介绍了今天使用比较常用的XShell工具登录成功如下:二、上传jdk安装包到Linux服务器jdk...

麒麟系统安装JAVA JDK教程_麒麟系统配置jdk

检查检查系统是否自带java在麒麟系统桌面空白处,右键“在终端打开”,打开shell对话框输入:java–version查看是否自带java及版本如图所示,系统自带OpenJDK,要先卸载自带JDK...

学习笔记-Linux JDK - 安装&配置

前提条件#检查是否存在JDKrpm-qa|grepjava#删除现存JDKyum-yremovejava*安装OracleJDK不分系统#进入安装文件目...

Linux新手入门系列:Linux下jdk安装配置

本系列文章是把作者刚接触和学习Linux时候的实操记录分享出来,内容主要包括Linux入门的一些理论概念知识、Web程序、mysql数据库的简单安装部署,希望能够帮到一些初学者,少走一些弯路。注意:L...

测试员必备:Linux下安装JDK 1.8你必须知道的那些事

1.简介在Oracle收购Sun后,Java的一系列产品就被整合到Oracle官网中,打开官网乍眼一看也不知道去哪里下载,还得一个一个的摸索尝试,而且网上大多数都是一些Oracle收购Sun前,或者就...

Linux 下安装JDK17_linux 安装jdk1.8 yum

一、安装环境操作系统:JDK版本:17二、安装步骤第一步:下载安装包下载Linux环境下的jdk1.8,请去官网(https://www.oracle.com/java/technologies/do...

在Ubuntu系统中安装JDK 17并配置环境变量教程

在Ubuntu系统上安装JDK17并配置环境变量是Java开发环境搭建的重要步骤。JDK17是Oracle提供的长期支持版本,广泛用于开发Java应用程序。以下是详细的步骤,帮助你在Ubuntu系...

如何在 Linux 上安装 Java_linux安装java的步骤

在桌面上拥抱Java应用程序,然后在所有桌面上运行它们。--SethKenlon(作者)无论你运行的是哪种操作系统,通常都有几种安装应用程序的方法。有时你可能会在应用程序商店中找到一个应用程序...

Windows和Linux环境下的JDK安装教程

JavaDevelopmentKit(简称JDK),是Java开发的核心工具包,提供了Java应用程序的编译、运行和开发所需的各类工具和类库。它包括了JRE(JavaRuntimeEnviro...

linux安装jdk_linux安装jdk软连接

JDK是啥就不用多介绍了哈,外行的人也不会进来看我的博文。依然记得读大学那会,第一次实验课就是在机房安装jdk,编写HelloWorld程序。时光飞逝啊,一下过了十多年了,挣了不少钱,买了跑车,娶了富...

linux安装jdk,全局配置,不同用户不同jdk

jdk1.8安装包链接:https://pan.baidu.com/s/14qBrh6ZpLK04QS8ogCepwg提取码:09zs上传文件解压tar-zxvfjdk-8u152-linux-...

运维大神教你在linux下安装jdk8_linux安装jdk1.7

1.到官网下载适合自己机器的版本。楼主下载的是jdk-8u66-linux-i586.tar.gzhttp://www.oracle.com/technetwork/java/javase/downl...

window和linux安装JDK1.8_linux 安装jdk1.8.tar

Windows安装JDK1.8的步骤:步骤1:下载JDK打开浏览器,找到JDK下载页面https://d.injdk.cn/download/oraclejdk/8在页面中找到并点击“下载...

最全的linux下安装JavaJDK的教程(图文详解)不会安装你来打我?

默认已经有了linux服务器,且有root账号首先检查一下是否已经安装过java的jdk任意位置输入命令:whichjava像我这个已经安装过了,就会提示在哪个位置,你的肯定是找不到。一般我们在...

取消回复欢迎 发表评论: