11_进程间通信.ppt

上传人:赵** 文档编号:51605090 上传时间:2022-10-19 格式:PPT 页数:30 大小:102.50KB
返回 下载 相关 举报
11_进程间通信.ppt_第1页
第1页 / 共30页
11_进程间通信.ppt_第2页
第2页 / 共30页
点击查看更多>>
资源描述

《11_进程间通信.ppt》由会员分享,可在线阅读,更多相关《11_进程间通信.ppt(30页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、进程间通信进程间通信概述概述n实现进程间通信实现进程间通信(IPC)的方法很多,但从历史来看,的方法很多,但从历史来看,很多都不可移植,经过多年的发展,已经有很大很多都不可移植,经过多年的发展,已经有很大的统一的统一nIPC的方法主要包括:的方法主要包括:l管道管道l消息队列消息队列l信号量信号量l共享内存共享内存l套接字套接字管道管道n管道是最古老的管道是最古老的IPC方式,在历史上,有两方面方式,在历史上,有两方面的限制:的限制:l只能以半双工方式工作只能以半双工方式工作l管道的两端必须是具有公共祖先的进程管道的两端必须是具有公共祖先的进程n但最近的但最近的Unix系统大多都取消这两方面的

2、限制,系统大多都取消这两方面的限制,但为了兼容性原因,很多应用我们仍然假设管道但为了兼容性原因,很多应用我们仍然假设管道只能以半双工方式工作只能以半双工方式工作无名管道和命名管道无名管道和命名管道n管道可以分为无名管道和命名管道两类管道可以分为无名管道和命名管道两类n无名管道没有名字,只能工作在具有同一个祖先无名管道没有名字,只能工作在具有同一个祖先进程的若干个进程中进程的若干个进程中n命名管道,又叫命名管道,又叫FIFO管道,可以在任何两个进程管道,可以在任何两个进程之间工作之间工作无名管道无名管道n通过调用通过调用pipe系统调用可以创建一个无名管道系统调用可以创建一个无名管道int pi

3、pe(int filedes2);n由参数由参数filedes返回两个文件描述符:返回两个文件描述符:filedes0为读而打开,为读而打开,filedes1为写而为写而打开,打开,filedes1的输出是的输出是filedes0的输的输入入管道管道内核用户进程fd0fd1使用管道使用管道n单个进程中管道基本没有什么用处单个进程中管道基本没有什么用处n调用调用pipe创建管道后,再调用创建管道后,再调用fork,就创建了,就创建了从父进程到子进程从父进程到子进程(或反向或反向)的的IPC通道通道n还可以通过多次调用还可以通过多次调用fork在两个子进程之间连接在两个子进程之间连接IPC通道通道

4、n管道的一方进程应该关闭自己不需要的管道描述管道的一方进程应该关闭自己不需要的管道描述符符管道管道内核父进程fd0fd1子进程fd0fd1从子进程到父进程的管道从子进程到父进程的管道管道管道内核父进程fd0子进程fd1两条规则两条规则n当管道的一端被关闭后,下列两条规则起作用当管道的一端被关闭后,下列两条规则起作用1.当读一个写端被关闭的管道时,所有数据被读取当读一个写端被关闭的管道时,所有数据被读取后,后,read返回返回0。(只要管道的写端还有进程,只要管道的写端还有进程,就不会产生文件结束就不会产生文件结束)2.如果写一个读端被关闭的管道,则产生信号如果写一个读端被关闭的管道,则产生信号

5、SIGPIPE,如果忽略或捕获该信号并返回,则,如果忽略或捕获该信号并返回,则write返回返回-1,errno设置为设置为EPIPE一段典型的代码一段典型的代码int main()int fd2;pipe(fd);if(pid_t pid=fork()0)close(fd0);write(fd1,.);.else close(fd1);read(fd0,.);FIFO管道管道(命名管道命名管道)n无名管道只能工作在具有同一个祖先进程的若干无名管道只能工作在具有同一个祖先进程的若干个进程中,个进程中,FIFO管道可以克服这个问题管道可以克服这个问题nFIFO管道是一种文件类型,可以被创建在文件

6、系管道是一种文件类型,可以被创建在文件系统中,并设置相应的权限统中,并设置相应的权限n多个进程可以通过分别以读多个进程可以通过分别以读/写方式打开该写方式打开该FIFO文件进行读文件进行读/写,从而达到进行管道通信的目的写,从而达到进行管道通信的目的nint mkfifo(char*pathname,mode_t mode)FIFO管道的主要用途管道的主要用途1.在进程之间传输数据,但不便于使用无名管道的在进程之间传输数据,但不便于使用无名管道的地方地方2.在客户进程在客户进程-服务器进程之间进行通信服务器进程之间进行通信XSI IPC(XSI进程间通讯进程间通讯)n有有3种种IPC被称为被称

7、为XSI IPC:消息队列、信号量和:消息队列、信号量和共享内存共享内存nXSI IPC没有使用文件系统名字空间,而是构造没有使用文件系统名字空间,而是构造了自己的名字空间了自己的名字空间n这这3种种IPC具有类似的处理方式具有类似的处理方式标识符和键标识符和键n每个内核中的每个内核中的IPC对象都用一个非负整数的标识对象都用一个非负整数的标识符加以引用,它是符加以引用,它是IPC对象的内部名对象的内部名n为了使多个合作进程能共享使用同一为了使多个合作进程能共享使用同一IPC对象,对象,Unix使用了外部名:键。每个使用了外部名:键。每个IPC对象都和一个对象都和一个键相关联键相关联n可以调用

8、可以调用ftok函数通过全局唯一字符串和项目函数通过全局唯一字符串和项目ID产生键产生键key_t ftok(char*path,int id);XSI IPC结构结构nIPC结构是在系统范围内起作用的,它不属于某结构是在系统范围内起作用的,它不属于某一个进程一个进程nIPC对象在文件系统中没有名字,只能使用专门对象在文件系统中没有名字,只能使用专门的命令和函数访问这些对象,不能通过文件描述的命令和函数访问这些对象,不能通过文件描述符来访问符来访问IPC相关的几个命令相关的几个命令nUnix系统提供了几个操纵系统提供了几个操纵IPC对象的命令对象的命令nipcs:列出系统中的列出系统中的IPC

9、对象对象nipcrm:删除指定的删除指定的IPC对象对象一个例子一个例子-Shared Memory Segments-key shmid owner perms bytes nattch status0 x0052e6a9 0 postgres 600 38207488 40 x0052e2c1 32769 postgres 600 38207488 4-Semaphore Arrays-key semid owner perms nsems0 x0052e6a9 0 postgres 600 170 x0052e6aa 32769 postgres 600 170 x0052e6ab 65

10、538 postgres 600 170 x0052e6ac 98307 postgres 600 170 x0052e6ad 131076 postgres 600 170 x0052e6ae 163845 postgres 600 170 x0052e6af 196614 postgres 600 170 x0052e2c1 229383 postgres 600 170 x0052e2c2 262152 postgres 600 170 x0052e2c3 294921 postgres 600 170 x0052e2c4 327690 postgres 600 170 x0052e2c

11、5 360459 postgres 600 170 x0052e2c6 393228 postgres 600 170 x0052e2c7 425997 postgres 600 17-Message Queues-key msqid owner perms used-bytes messages消息队列消息队列n消息队列可以实现不同进程之间的消息传递消息队列可以实现不同进程之间的消息传递n消息队列组织成一个链接表消息队列组织成一个链接表n消息的接收不一定按照先进先出的顺序,也可以消息的接收不一定按照先进先出的顺序,也可以按照消息的类型接收按照消息的类型接收n消息队列是可靠的、有流控的、面向对

12、象的消息队列是可靠的、有流控的、面向对象的操纵消息队列操纵消息队列n先通过先通过ftok取得键值取得键值keyn打开或创建消息队列打开或创建消息队列int msgget(key_t key,int flag);n发送消息发送消息int msgsnd(int id,void*p,size_t nbytes,int flag);n接收消息接收消息ssize_t msgrcv(int id,void*p,size_t nbytes,long type,int flag);信号量信号量n信号量是信号量是OS提供的一种重要的进程同步工具提供的一种重要的进程同步工具nUnix信号量实现了整型信号量的一个超

13、集功能。信号量实现了整型信号量的一个超集功能。它是一组信号量,被称为信号量集,可以原子地它是一组信号量,被称为信号量集,可以原子地对这组信号量集的若干个信号量一起进行操作对这组信号量集的若干个信号量一起进行操作信号量上的操作信号量上的操作n信号量的操作主要包括信号量的操作主要包括3个方面个方面1.打开或创建信号量打开或创建信号量 2.信号量值操作信号量值操作3.获取或者设置信号量属性获取或者设置信号量属性打开打开/创建信号量创建信号量n和消息队列一样,先调用和消息队列一样,先调用ftok获得键值获得键值keyn通过通过key打开或创建信号量,得到一个信号量集打开或创建信号量,得到一个信号量集的

14、标识的标识int semget(key_t key,int nsems,int flag);信号量值操作信号量值操作n信号量值的操作也就是信号量值的操作也就是wait(P)操作和操作和signal(V)操作操作nint semop(int semid,struct sembuf semoparray,size_t nops);其中其中sembuf结构表示了如何操作信号量的值结构表示了如何操作信号量的值nsemop具有原子性,要么执行所有的操作,要么具有原子性,要么执行所有的操作,要么什么也不做什么也不做sembuf结构体结构体struct sembuf unsigned short sem_n

15、um;/信号量集中的编号信号量集中的编号 short sem_op;/信号操作信号操作 short sem_flg;/标志标志sem_op为正表示增加信号量的值,为负表示减少信号量的值为正表示增加信号量的值,为负表示减少信号量的值如果信号量的值不够减,进程被阻塞如果信号量的值不够减,进程被阻塞(无无IPC_NOWAIT标志标志)共享内存共享内存n共享存储允许两个或更多的进程共享一定的存储共享存储允许两个或更多的进程共享一定的存储区区n这是最快的一种这是最快的一种IPCn需要进程自己解决访问同步问题需要进程自己解决访问同步问题获得共享存储标识获得共享存储标识n和消息队列同样,先调用和消息队列同样

16、,先调用ftok获得键值获得键值keyn再调用再调用shmget获得共享存储标识获得共享存储标识int shmget(key_t key,size_t size,int flag);将共享存储段连接到地址空间中将共享存储段连接到地址空间中n共享存储段只有映射到进程的地址空间中才能被共享存储段只有映射到进程的地址空间中才能被访问访问n通过调用通过调用shmat可以将共享存储段连接到进程地可以将共享存储段连接到进程地址空间中址空间中void*shmat(int shmid,const void*addr,int flag);取消共享存储段在进程空间中的映射取消共享存储段在进程空间中的映射n当使用完毕后,需要将共享存储段从进程地址空当使用完毕后,需要将共享存储段从进程地址空间中撤销间中撤销nint shmdt(void*addr);注意注意n由于由于IPC对象是系统范围内的对象,不属于进程,对象是系统范围内的对象,不属于进程,所以,当进程结束的时候,系统不会帮进程清除所以,当进程结束的时候,系统不会帮进程清除相应的相应的IPC对象,清理工作是进程的责任对象,清理工作是进程的责任n所以,如果可能,尽量避免使用所以,如果可能,尽量避免使用IPC对象。比如,对象。比如,如果是简单情况,可以使用文件锁代替信号量。如果是简单情况,可以使用文件锁代替信号量。

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 高考资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁