嵌入式Linux系统编程——连进程间通信都不懂,还自称linux大神?
gudong366 2025-07-27 17:27 4 浏览
所有学嵌入式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 获取这个值。
相关推荐
- 理解Linux进程和线程(linux的进程和线程的区别)
-
#进程-进程是一个执行中的程序,它拥有自己独立的内存空间,不同进程的地址空间是相互隔离的。-进程有自身的代码段,数据段,堆,栈等。进程需要耗费资源创建和销毁。-进程之间的通信需要借助IPC(I...
- Linux进程上下文切换过程context_switch详解
-
1前言1.1Linux的调度器组成2个调度器可以用两种方法来激活调度一种是直接的,比如进程打算睡眠或出于其他原因放弃CPU另一种是通过周期性的机制,以固定的频率运行,不时的检测是否有必要因此...
- linux init进程(linux init 1)
-
一.init是Linux系统操作中不可缺少的程序之一。所谓的init进程,它是一个由内核启动的用户级进程。内核自行启动(已经被载入内存,开始运行,并已初始化所有的设备驱动程序和数据结构等)之后,就通...
- 【Linux系统编程】特殊进程之守护进程
-
01.守护进程概述守护进程(DaemonProcess),也就是通常说的Daemon进程(精灵进程),是Linux中的后台服务进程。它是一个生存期较长的进程,通常独立于控制终端并且周期性地...
- 在 Linux 中如何强制停止进程?kill 和 killall 命令有什么区别?
-
在日常工作中,您会遇到两个用于在Linux中强制结束程序的命令;kill和killall。虽然许多Linux用户都知道kill命令,但知道并使用killall命令的人并不多。这两个命令...
- 嵌入式Linux系统编程——连进程间通信都不懂,还自称linux大神?
-
所有学嵌入式Linux系统的看过来了,以下内容是每一位想学习Linux嵌入式系统想要了解的内容,真的很想要分享给大家!本文分享的内容主要如下几个方面:(绝对的精品资料,不收藏可惜了)6.1共享内存...
- Linux基础运维篇:Linux进程与服务管理(第010课)
-
在Linux系统里,进程和服务管理就像是一个大管家的工作,得把各种程序的运行安排得明明白白,这样系统才能稳稳当当地干活。进程就是程序跑起来的一个实例,服务呢,是那种一直在后台默默工作的进程,咱下面...
- 深度剖析Linux内核《如何唤醒线程》
-
linux内核如何唤醒线程//本文代码片段出自linux内核版本:4.1.15linux内核唤醒线程主要使用wake_up_process()。一、wake_up_process()分析在linux内...
- 字节因它而跳动!顶级资深大牛整理的“深入理解Linux内核”
-
如果你对Linux如何工作。其性能又为什么会如此之高怀有强烈的好奇心。你将会从这里找到答案.阅读本文之后,你会通过上千行代码找到自己的方式来区别重要数据结构和次要数据结构的不同,简而言之,你蒋成为一名...
- 都说Linux内核很吊,它到底是个啥玩意儿?
-
了解完基本信息之后,我们来看一看,为什么说它吊?吊在哪里?甚至我觉得不仅仅是c/c++Linux开发的可以学习,Java、Python等方面的都可以学习提升一下。linux内核有什么用?linux内核...
- 77% 的 Linux 运维都不懂的内核问题,这篇全告诉你了
-
前言之前在实习时,听了OOM的分享之后,就对Linux内核内存管理充满兴趣,但是这块知识非常庞大,没有一定积累,不敢写下,担心误人子弟,所以经过一个一段时间的积累,对内核内存有一定了解之后,今...
- Linux 内核开发流程的一个典型例子
-
>authorLinusTorvalds<torvalds@linux-foundation.org>2025-07-0813:31:29-0700>committ...
- Vold原理介绍(volte基本原理)
-
一、Vold简介Android中Vold是volumeDaemon,即Volume守护进程,用来管理Android中存储类的热拔插事件。这里的热插拔涉及的场景如:手机usb以MTP或者传输照片方式...
- 2-剖析Linux内核源码分析《中断处理》
-
一、中断向量及汇编指令1、中断向量Intelx86系列机器共支持256种向量中断,Intel用一个8位无符号整数叫做一个向量,因此也叫中断向量。所有256种中断可分为两大类:异常和中断,异常又称为故...
- 剖析linux内核(一文看懂linux内核)
-
PASmm_struct详解malloc()函数是用户态常用的分配内存接口,mmap()函数是用户态常用创建文件映射或匿名映射。进程地址空间在linux内核当中使用structvm_area...
- 一周热门
- 最近发表
- 标签列表
-
- linux一键安装 (31)
- linux运行java (33)
- ln linux (27)
- linux 磁盘管理 (31)
- linux 内核升级 (30)
- linux 运行python (28)
- linux 备份文件 (30)
- linux 网络测试 (30)
- linux 网关配置 (31)
- linux jre (32)
- linux 杀毒软件 (32)
- linux语法 (33)
- linux博客 (33)
- linux 压缩目录 (37)
- linux 查看任务 (32)
- 制作linux启动u盘 (35)
- linux 查看存储 (29)
- linux乌班图 (31)
- linux挂载镜像 (31)
- linux 软件源 (28)
- linux题目 (30)
- linux 定时脚本 (30)
- linux 网站搭建 (28)
- linux 远程控制 (34)
- linux bind (31)