- 1、本文档共21页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
管道 进程间通信概述 无名管道 命名管道 进程间通信 ?进程间通信(IPC:Inter Processes Communication) 进程是一个独立的资源分配单元,不同进程(这里所说的进程通常指的是用户进程)之间的资源是独立的,没有关联,不能在一个进程中直接访问另一个进程的资源(例如打开的文件描述符)。 进程不是孤立的,不同的进程需要进行信息的交互和状态的传递等,因此需要进程间通信。 ?进程间通信功能: ?数据传输:一个进程需要将它的数据发送给另一个进程。 ?资源共享:多个进程之间共享同样的资源。 ?通知事件:一个进程需要向另一个或一组进程发送消息,通知它们发生了某种事件。 ?进程控制:有些进程希望完全控制另一个进程的执行(如Debug进程),此时控制进程希望能够拦截另一个进程的所有操作,并能够及时知道它的状态改变。 无名管道 ?管道(pipe)又称无名管道。 ?无名管道是一种特殊类型的文件,在应用层体现为两个打开的文件描述符。 管道是最古老的UNIX IPC方式,其特点是: 1、半双工,数据在同一时刻只能在一个方向上流动。 2、数据只能从管道的一端写入,从另一端读出。 3、写入管道中的数据遵循先入先出的规则。 4、管道所传送的数据是无格式的,这要求管道的读出方与写入方必须事先约定好数据的格式,如多少字节算一个消息等。 5、管道不是普通的文件,不属于某个文件系统,其只存在于内存中。 6、管道在内存中对应一个缓冲区。不同的系统其大小不一定相同。 7、从管道读数据是一次性操作,数据一旦被读走,它就从管道中被抛弃,释放空间以便写更多的数据。 8、管道没有名字,只能在具有公共祖先的进程之间使用。 Pipe函数 ?#include unistd.h int pipe(int filedes[2]); 功能:经由参数filedes返回两个文件描述符 参数: ?filedes为int型数组的首地址,其存放了管道的文件描述符fd[0]、fd[1]。 ?filedes[0]为读而打开,filedes[1]为写而打开管道,filedes[0]的输出是filedes[1]的输入。 返回值: 成功:返回0 失败:返回-1 父子进程通过管道实现数据的传输 01_pipe_1.c 子进程写入管道 父进程从管道中读取 从管道中读数据的特点 1、默认用read函数从管道中读数据是阻塞的。 2、调用write函数向管道里写数据,当缓冲区已满时write也会阻塞。 3、编程时可通过fcntl函数设置文件的阻塞特性。 设置为阻塞: fcntl(fd, F_SETFL, 0); 设置为非阻塞: fcntl(fd, F_SETFL, O_NONBLOCK); 01_pipe_2.c 带阻塞和不带阻塞 文件描述符概述 ?文件描述符是非负整数,是文件的标识。 ?用户使用文件描述符(file descriptor)来访问文件。 ?利用open打开一个文件时,内核会返回一个文件描述符。 每个进程都有一张文件描述符的表,进程刚被创建时,标准输入、标准输出、标准错误输出设备文件被打开,对应的文件描述符0、1、2 记录在表中。 在进程中打开其他文件时,系统会返回文件描述符表中最小可用的文件描述符,并将此文件描述符记录在表中。 注意: Linux中一个进程最多只能打开NR_OPEN_DEFAULT (即1024)个文件,故当文件不再使用时应及时调用close函数关闭文件。 练习 题目:实现ls --help | more 功能 ?提示: ?ls --help是个外部命令,它向标准输出打印ls的帮助文档。 ?more是个外部命令,它默认是从标准输入中获取输入,并分屏显示到屏幕上。 ?在使用shell命令时,可使用管道“|”将两个命令连接起来。 用管道“|”将两个命令连接后: 提示: ?创建一个管道以便让ls --help的输出和more的输入可以联系起来。 ?子进程exec执行ls --help命令之前重定向“标准输出”到“管道写端”。 ?父进程exec执行more命令之前重定向“标准输入”到“管道读端”。 命名管道 命名管道(FIFO)和管道(pipe)基本相同,但也有一些显著的不同,其特点是: 1、半双工,数据在同一时刻只能在一个方向上流动。 2、写入FIFO中的数据遵循先入先出的规则。 3、FIFO所传送的数据是无格式的,这要求FIFO的读出方与写入方必须事先约定好数据的格式,如多少字节算一个消息等。 4、FIFO在文件系统中作为一个特殊的文件而存在,但FIFO中的内容却存放在内存中。 5、管道在内存中对应一个缓冲区。不同的系统其大小不一定相同。 6、从FIFO读数据是一次性操作,数据一旦被读,它就从FIFO中被抛弃,释放空间以便写更多的数据。 7、当使用FIF
文档评论(0)