第十章 进程间通信.ppt

  1. 1、本文档共18页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第十章进程间通信整理ppt

LOGO 第十章 进程间通信 嵌入式 进程间通信IPC(InterProcess Communication)是一种进程之间交换信息的一种技术,IPC表示各种进程通信方式的统称 IPC的类型有管道、消息队列、信号量、共享存储、网络等 并不是所有的系统都支持所 有的进程间通信方式 进程间通信的概念 半双工管道简称管道,它是UNIX IPC的最老形式,是所有的UNIX系统都支持的IPC 管道有两种限制,一是半双工,数据只能在一个方向上流动,二是它们只能在具有共同祖先的进程间使用。 流管道没有第一种限制,FIFO和命名管道没有第二种限制 管道的创建 管道 在单进程中使用管道没有意义,管道通常使用在父子进程间进行通信 fork函数的子进程继承父进程打开的文件描述符,包括管道,在父子进程中各关闭管道的一端就能建立起一条父子进程的通道 父子进程关闭的管道端决定了通道的方向 管道的通信 对管道的读写操作与文件IO相同接口 当读一个写端已被关闭的管道时,在所有数据都被读取后,read返回0,表示达到文件结束,而不返回EOF,因为写端的进程未终止 当写一个读端已被关闭的管道时,则产生信号SIGPIPE,如果忽略或捕捉该信号,则write函数出错返回,errno置为EPIPE 写管道有最大 缓冲,超过时有可能在多进程写时发生数据穿插 管道的通信规则 因为常见的操作是创建一个连接到另一个进程的管道,然后读其输入或向其发送输入,所以标准IO提供一组函数实现此功能,它创建一个管道,fork一个进程,关闭管道的不使用端,exec一个shell执行命令,最后等待命令终止 popen/pclose函数 UNIX过滤程序从标准输入读取数据,对其进行适当处理后写到标准输出。 当同一个程序产生某个过滤程序的输入,同时又读取该过滤程序的输出是,则该过滤程序就成为协同进程 popen函数提供了连接到另一个进程的标准输入或输出的单行管道,而对于协同进程,它有连接到另一个进程的2为何单行管道,一个输入一个输出,先将要处理的数据写到输入,经过处理后再从输出读 协同进程 FIFO又称命名管道。不相关的进程也能通过命名管道来交换数据 FIFO管道的创建 非阻塞标志对管道的影响 类似普通管道,若写一个尚无进程为读打开的FIFO,产生信号SIGPIPE。 一个给定的FIFO可以有多个写进程,参数PIPE_BUF说明了原子写的最大数据量。 若某个FIFO的最后一个写进程关闭了该FIFO,则为读该FIFO的进程产生一个EOF FIFO FIFO由shell命令使用以将数据从一条管道线传送到另一条,无需为此而创建中间临时文件 FIFO用于客户机-服务器应用程序中,以在客户机和服务器之间传递数据 FIFO的用途 消息队列、信号量和共享存储是三种系统V的IPC,有许多相似之处 三种IPC都使用一个非负的整数标示符引用 创建时需要指定一个关键字,类型为key_t,内核将关键字转为标示符返回 使用IPC_PRIVATE表示创建一个新的私有IPC结构,也可以在标志位中设置IPC_CREAT来创建一个新的共有IPC结构 可以通过ftok函数指定2个参数来创建一个关键字 消息队列、信号量和共享存储 当创建IPC时,系统为每个IPC设置一个ipc_perm结构,该结构规定了IPC的许可权和所有者 可以通过相应函数修改IPC的所有者和访问权限 和普通文件一样,IPC有三组访问权限,每组访问权限都只有读和写,没有执行权限 许可权结构 IPC结构在系统范围内起作用,没有范围计数,即创建一个IPC并添加消息后终止,该消息仍然存在,而对于管道、FIFO,进程终止后就删除管道和管道内的数据 IPC没有名字,无法在文件系统中索引它们,因此不能使用文件IO来操作,而必须使用专门的系统调用函数来操作 限制 消息队列克服了早期UNIX IPC的缺点,例如信号能够传输的信息量有限,而管道/命名管道只能传输无格式的字节流,并且受缓冲区大小限制 消息队列是一个消息的链表,消息相当于记录,具有特定的格式和优先级,对消息队列有写权限的进程可以按照一定的规则添加新消息,对消息队列有读权限的进程可以从消息队列中读消息 消息队列 消息队列的创建,每个消息队列都有一个msqid_ds结构与其相关,该结构规定了队列的当前状态 对消息队列执行操作,该功能操作类似ioctl函数 添加消息 获取消息 消息队列 信号量与管道和消息队列不同,它是一个计数器,用于多线程对共享数据对象的存取 1.测试控制该资源的信号量2.若值为正,则进程可以使用该资源,并将信号量减1。3若信号量值为0,则进程进入休眠直至信号量值大于0,该进程被唤醒后返回步骤1 当进程不再使用该信号量控制的共享资源时,该信号量加1,如果有进程在休眠等待此信号量则唤醒它们

文档评论(0)

zyzsaa + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档