所有学嵌入式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.4popen和pclose
6.5FIFO
6.5.1创建FIFO
6.5.2访问FIFO
6.6Socket
后面分享的文章“进程”中我们讨论了进程的创建方式,也展示了一个进程怎么获取子进程的退
出状态。这可以算是最简单的进程间通讯方式,但毋庸置疑,它绝不是是最强悍的一种。第
七章中所提供的通讯机制,对父进程而言,不仅通过设置命令行参数和环境变量之外,并没
有提供任何的与子进程通讯的方式,同样,对于子进程而言,也只有退出代码这惟一一种向
父进程返回信息的方式。这种通讯机制不容许进程与正在运行中的子进程通讯,更不可能允
许两个没有派生关系的进程之间自由地对话。
本章介绍的进程间通讯机制则完全解除了这种限制。我们将展示供“父子”进程、“无关”进程甚至是分别运行在不同主机的进程之间进行通讯的多种形式。
进程间通讯(Interprocsscommunication,IPC)是在不同进程之间传递数据的方式。诸如,互联网浏览器可以向服务器发送一个恳求,此后服务器会传回HTML信息。这样的数据传递一般是通过一种功能类似电话线路联接的套接字来完成的。另外一个反例,你可以用ls|lpr这个命令将一个目录下的文件名复印下来。Shell程序会创建一个ls进程和一个lpr进程,之后用一个“管道(用|符号表示)”将它们联接上去。管线为这两个进程提供了一种双向通讯的渠道。这个反例中,由ls进程向管线写入信息linux开发培训,而lpr进程则从管线读取。
在本章中,我们将讨论五种不同的进程间通讯机制:
共享显存容许两个进程通过对特定显存地址的简单读写来完成通讯过程。
映射显存与共享显存的作用相同,不过它须要关联到文件系统中的一个文件上。
管线容许从一个进程到另一个关联进程之间的次序数据传输。
FIFO与管线相像,而且由于FIFO对应于文件系统中的一个文件,无关的进程也可以完成通讯。
套接字容许无关的进程、甚至是运行在不同主机的进程之间相互通信。
还有一种消息队列,读者可以自己查看Linux的帮助文档。
这种进程间通讯机制(IPC)可以按以下标准进行分辨:
通讯对象是否限制为互相关联的进程(即是否有共同的父进程),或则限制为共享同一个文件系统的进程,还是可以为联接到同一个网路中的不同主机上的进程。
通讯中的一个进程是否限制为仅能读取或则写入数据。
准许出席通讯的进程的总量。
通讯进程是否直接在通讯机制(IPC)中得到同步——例如,读取数据的进程会等待直至有数据抵达时开始读取。
本章中,我们不再讨论这些只能进行有限次数的进程间通讯机制,比如通过子进程的退出代码进行通讯的形式等。
6.1共享显存
共享显存是进程间通讯中最简单的方法之一。共享显存容许两个或更多进程访问同一块显存,就好似malloc()函数向不同进程返回了指向同一个数学显存区域的表针。当一个进程改变了这块地址中的内容的时侯,其它进程就会察觉到这个修改。
由于所有进程共享同一块显存构建嵌入式linux系统,共享显存在各类进程间通讯方法中具有最高的效率。访问共享显存区域和访问进程独有的显存区域一样快,并不须要通过系统调用或则其它须要切入内核的过程来完成。同时它也避开了对数据的各类何必要的复制。
由于系统内核没有对访问共享显存进行同步,你必须提供自己的同步举措。比如构建嵌入式linux系统,在数据被写入之前不容许进程从共享显存中读取信息、不容许两个进程同时向同一个共享显存地址写入数据等。解决这种问题的常用方式是通过使用讯号量进行同步。讯号量的使用将在下一节中介绍。不过,我们的程序中只有一个进程访问了共享显存,因而在集中展示了共享显存机制的同时,我们避开了让代码被同步逻辑搞得混乱不堪。
6.1.1显存模型
要使用一块共享显存,进程必须首先分配它。随即须要访问这个共享显存块的每一个进程都必须将这个共享显存绑定到自己的地址空间中。当完成通讯以后,所有进程都将脱离共享显存,但是由一个进程释放该共享显存块。
理解Linux系统显存模型可以有助于解释这个绑定的过程。在Linux系统中,每位进程的虚拟显存是被分为许多页面的。这种显存页面中包含了实际的数据。每位进程就会维护一个从显存地址到虚拟显存页面之间的映射关系。虽然每位进程都有自己的显存地址,不同的进程可以同时将同一个显存页面映射到自己的地址空间中linux学习论坛,进而达到共享显存的目的。
分配一个新的共享显存块会创建新的显存页面。由于所有进程都希望共享对同一块显存的访问,只应由一个进程创建一块新的共享显存。再度分配一块早已存在的显存块不会创建新的页面,而只是会返回一个标示该显存块的标示符。一个进程如需使用这个共享显存块,则首先须要将它绑定到自己的地址空间中。这样会创建一个从进程本身虚拟地址到共享页面的映射关系。当对共享显存的使用结束以后,这个映射关系将被删掉。当再也没有进程须要使用这个共享显存块的时侯,必须有一个(且只能是一个)进程负责释放这个被共享的显存页面。
所有共享显存块的大小都必须是系统页面大小的整数倍。系统页面大小指的是系统中单个显存页面包含的字节数。在Linux系统中,显存页面大小是4KB,不过你一直应当通过调用getpagesize获取这个值。