第十章进程间通信.ppt

上传人:本田雅阁 文档编号:2565688 上传时间:2019-04-09 格式:PPT 页数:18 大小:661.01KB
返回 下载 相关 举报
第十章进程间通信.ppt_第1页
第1页 / 共18页
第十章进程间通信.ppt_第2页
第2页 / 共18页
第十章进程间通信.ppt_第3页
第3页 / 共18页
亲,该文档总共18页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《第十章进程间通信.ppt》由会员分享,可在线阅读,更多相关《第十章进程间通信.ppt(18页珍藏版)》请在三一文库上搜索。

1、第十章 进程间通信,嵌入式,进程间通信IPC(InterProcess Communication)是一种进程之间交换信息的一种技术,IPC表示各种进程通信方式的统称 IPC的类型有管道、消息队列、信号量、共享存储、网络等 并不是所有的系统都支持所 有的进程间通信方式,进程间通信的概念,半双工管道简称管道,它是UNIX IPC的最老形式,是所有的UNIX系统都支持的IPC 管道有两种限制,一是半双工,数据只能在一个方向上流动,二是它们只能在具有共同祖先的进程间使用。 流管道没有第一种限制,FIFO和命名管道没有第二种限制 管道的创建,管道,在单进程中使用管道没有意义,管道通常使用在父子进程间进

2、行通信 fork函数的子进程继承父进程打开的文件描述符,包括管道,在父子进程中各关闭管道的一端就能建立起一条父子进程的通道 父子进程关闭的管道端决定了通道的方向,管道的通信,对管道的读写操作与文件IO相同接口 当读一个写端已被关闭的管道时,在所有数据都被读取后,read返回0,表示达到文件结束,而不返回EOF,因为写端的进程未终止 当写一个读端已被关闭的管道时,则产生信号SIGPIPE,如果忽略或捕捉该信号,则write函数出错返回,errno置为EPIPE 写管道有最大 缓冲,超过时有可能在多进程写时发生数据穿插,管道的通信规则,因为常见的操作是创建一个连接到另一个进程的管道,然后读其输入或

3、向其发送输入,所以标准IO提供一组函数实现此功能,它创建一个管道,fork一个进程,关闭管道的不使用端,exec一个shell执行命令,最后等待命令终止,popen/pclose函数,UNIX过滤程序从标准输入读取数据,对其进行适当处理后写到标准输出。 当同一个程序产生某个过滤程序的输入,同时又读取该过滤程序的输出是,则该过滤程序就成为协同进程 popen函数提供了连接到另一个进程的标准输入或输出的单行管道,而对于协同进程,它有连接到另一个进程的2为何单行管道,一个输入一个输出,先将要处理的数据写到输入,经过处理后再从输出读,协同进程,FIFO又称命名管道。不相关的进程也能通过命名管道来交换数

4、据 FIFO管道的创建 非阻塞标志对管道的影响 类似普通管道,若写一个尚无进程为读打开的FIFO,产生信号SIGPIPE。 一个给定的FIFO可以有多个写进程,参数PIPE_BUF说明了原子写的最大数据量。 若某个FIFO的最后一个写进程关闭了该FIFO,则为读该FIFO的进程产生一个EOF,FIFO,FIFO由shell命令使用以将数据从一条管道线传送到另一条,无需为此而创建中间临时文件 FIFO用于客户机-服务器应用程序中,以在客户机和服务器之间传递数据,FIFO的用途,消息队列、信号量和共享存储是三种系统V的IPC,有许多相似之处 三种IPC都使用一个非负的整数标示符引用 创建时需要指定

5、一个关键字,类型为key_t,内核将关键字转为标示符返回 使用IPC_PRIVATE表示创建一个新的私有IPC结构,也可以在标志位中设置IPC_CREAT来创建一个新的共有IPC结构 可以通过ftok函数指定2个参数来创建一个关键字,消息队列、信号量和共享存储,当创建IPC时,系统为每个IPC设置一个ipc_perm结构,该结构规定了IPC的许可权和所有者 可以通过相应函数修改IPC的所有者和访问权限 和普通文件一样,IPC有三组访问权限,每组访问权限都只有读和写,没有执行权限,许可权结构,IPC结构在系统范围内起作用,没有范围计数,即创建一个IPC并添加消息后终止,该消息仍然存在,而对于管道

6、、FIFO,进程终止后就删除管道和管道内的数据 IPC没有名字,无法在文件系统中索引它们,因此不能使用文件IO来操作,而必须使用专门的系统调用函数来操作,限制,消息队列克服了早期UNIX IPC的缺点,例如信号能够传输的信息量有限,而管道/命名管道只能传输无格式的字节流,并且受缓冲区大小限制 消息队列是一个消息的链表,消息相当于记录,具有特定的格式和优先级,对消息队列有写权限的进程可以按照一定的规则添加新消息,对消息队列有读权限的进程可以从消息队列中读消息,消息队列,消息队列的创建,每个消息队列都有一个msqid_ds结构与其相关,该结构规定了队列的当前状态 对消息队列执行操作,该功能操作类似

7、ioctl函数 添加消息 获取消息,消息队列,信号量与管道和消息队列不同,它是一个计数器,用于多线程对共享数据对象的存取 1.测试控制该资源的信号量2.若值为正,则进程可以使用该资源,并将信号量减1。3若信号量值为0,则进程进入休眠直至信号量值大于0,该进程被唤醒后返回步骤1 当进程不再使用该信号量控制的共享资源时,该信号量加1,如果有进程在休眠等待此信号量则唤醒它们,信号量,为正确使用信号量,对其的测试及减1操作应当是原子操作,通常在内核实现 初始值为1的信号量称为双态信号量,它控制单个资源 与信号量相关的数据结构为semid_ds 创建一个信号量集合 信号量的操作,信号量,共享存储允许两个或多个进程共享一定的存储区,由于不涉及数据的拷贝,这是最快的一种IPC 对共享存储的采取需要同步 每个共享存储都有一个shmid_ds结构 创建一个共享存储区 操作一个共享存储区 连接/解除连接一个共享存储区,共享存储,Thank You!,嵌入式,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1