第5章初期进程间通讯无名管线有名管线讯号无名管线有名管线5.25.1讯号5.3☞点击查看本小节知识构架☞点击查看本小节知识构架☞点击查看本小节知识构架学习目标了解把握把握把握了解初期进程间通讯机制的原理1把握初期进程间通讯机制的特性及应用场合42把握初期进程间通讯机制的插口方式3把握初期进程间通讯机制的编程方式销售额把握知识理解知识熟悉知识了解知识2.52.52.52.5在后面的章节中,早已介绍了有关任务的执行单位——进程的概念。通过了解进程使用的地址空间的性质,可以晓得每一个进程都享有自己的虚拟地址空间,因而进程间实现数据的传递须要引入进程的通讯机制。进程的通讯机制有好多种。本章将介绍三种初期进程间通讯机制,这种机制应用于本地通讯,相对容易理解,读者应熟练把握。5.1无名管线5.1.1无名管线简介返回目录5.1.2无名管线的特点5.1.3无名管线的通讯5.1无名管线Linux的进程通讯机制基本是从UNIX平台承继而至的。管线是UNIX系统上最古老的进程间通讯(InterProcessCommunication,IPC)方式。管线最早出现在20世纪70年代UNIX的第三个版本。
管线可以把一个程序的输出直接联接到另一个程序的输入,借此来构建联接。管线分两种,一种是无名管线,一种是有名管线。管线是一种特殊的文件,它拥有与文件操作类似的方法,但同时也具有与文件不同的属性。管线的本质是在内核空间上的一段特殊显存区域,无名管线的实现原理如图所示。5.1.1无名管线简介5.1无名管线正如上图所示,每位进程都有4GB的虚拟地址空间,其中0~3GB为用户空间,3~4GB为内核空间。因为每位进程都可以通过系统调用步入内核(内核空间由系统内所有进程共享的)。为此,无名管线则被创建在内核空间上的。无名管线使用时有固定的读端和写端,发送消息须要向管线的写端写入,接收消息须要向管线的读端读取,这样即可完成数据的传递了。5.1.1无名管线简介5.1无名管线通过对无名管线的简单介绍,可以看出其通讯方法很直接。无名管线不同于普通文件unix系统 进程间通信,在对其及进行操作时,须要注意无名管线的一些特点,以保证操作管线时不会出现问题。在了解这种特点之前,先介绍无名管线的插口及使用。5.1.2无名管线的特点#includeintpipe(intpipefd[2]);pipe()函数拿来创建一个无名管线,参数pipefd[2]为一个链表,拿来保存函数返回的两个文件描述符,将pipefd[0]视为管线的读端,而pipefd[1]视为管线的写端,因而通过该管线进行通讯的进程,只需操作这两个文件描述符即可。
这与普通文件的操作没有任何区别,只是设定了特定的文件描述符拿来读写。5.1无名管线为此,无名管线的操作有如下特点:(1)无名管线只能用于具有亲缘关系的进程之间通讯(如兄妹进程)。(2)类似于单工的模式,无名管线具有固定的读端与写端。(3)无名管线其实是特殊的文件redflag linux,但对它的读写可以使用文件I/0中read()函数、write()函数直接操作文件描述符即可。(4)无名管线本质是一段内核空间中的显存段,因而不能使用lseek()函数对管线进行定位操作。(5)无名管线的操作属于一次性操作,一旦对管线中的数据进行读取,读取的数据将会从管线中移除。5.1.2无名管线的特点5.1无名管线(6)无名管线的大小是固定的,向无名管线写入数据,当管线写满时,继续写入将会阻塞。(7)无名管线中数据被写满后,写操作将会阻塞,当管线中出现4KB以上的空闲空间时,可以继续写入4KB的整倍数的数据。(8)当无名管线的读端被关掉时,从写端写入数据,管线将会断裂美国linux主机,进程将会退出。关掉读端,正式用于读的文件描述符关掉即可。(9)当管线无数据时,读操作将会阻塞;当管路中有数据时,且写端关掉时,读操作可以读取,不会阻塞。
5.1.2无名管线的特点5.1无名管线本节将通过教材中例5-4展示通过无名管线使兄妹进程进行通讯unix系统 进程间通信,父进程读取文件test1.txt中的数据并写入管线,子进程读取管线将数据写入到test2.txt。运行结果如下,使用cat命令查看被读取文件以及生成的文件,可以看出读取成功。5.1.3无名管线的通讯linux@Master:~/1000phone/pipe$./a.outlinux@Master:~/1000phone/pipe$cattest2.txthelloworldhelloworldhelloworldlinux@Master:~/1000phone/pipe$catte
文章评论