欢迎来到天天文库
浏览记录
ID:24390151
大小:187.00 KB
页数:38页
时间:2018-11-14
《linux操作系统分析13942》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、Linux操作系统分析主讲:陈香兰助教:贾永泉、毛熠璐xlanchen@ustc.edu.cn3606864-83(西区电三421)Autumn2007进程间同步和通信xlanchen@2007.10.25进程间通信IPC,Inter-ProcessCommunicationUnix系统提供的基本的IPC包括:1、管道和FIFO(有名管道)2、消息3、信号量4、共享内存区5、套接字xlanchen@2007.10.253LinuxOperatingSystemsanalysis1、管道(pipe)管道是所有Unix都提供的一种IPC机制管道是半双工的,数据只能向一个方向流动;一个进程将数据写
2、入管道,另一个进程从管道中读取数据数据的读出和写入:写入的内容每次都添加在管道缓冲区的末尾,每次都是从缓冲区的头部读出数据。需要双方通信时,需要建立起两个管道;只能用于父子进程或者兄弟进程之间(具有亲缘关系的进程);xlanchen@2007.10.254LinuxOperatingSystemsanalysis在shell中使用管道的例子命令:“ls
3、more”使用pipeline“
4、”将两个命令”ls”和“more”连接起来,使得ls的输出成为more的输入也可以使用如下的两个命令命令1:“ls>tmp”命令2:”more5、more的输入重定向到tmp文件xlanchen@2007.10.255LinuxOperatingSystemsanalysis创建一个管道管道可看成是被打开的文件,但并没有真实的文件与之对应pipe()系统调用用来创建一个新的管道#includeintpipe(intfiledes[2]);管道两端分别用描述符filedes[0]和filedes[1]描述管道两端的功能是固定的:filedes[0]只能用于读,称为管道读端;filedes[1]只能用于写,称为管道写端。若试图从写端读,或者向读端写都将导致错误发生。一般文件的I/O函数都可用于管道,如close、re6、ad、write等。xlanchen@2007.10.256LinuxOperatingSystemsanalysis使用管道的典型程序testpipe.c管道只能在具有亲缘关系的进程之间进行通信通过fork传递管道的描述符任意的两个进程不可能共享同一个管道无法打开已经存在的管道xlanchen@2007.10.257LinuxOperatingSystemsanalysisFIFO管道的一个重大限制是它没有名字,因此只能用于具有亲缘关系的进程间通信,在有名管道(namedpipe或FIFO)提出后,该限制得到了克服。FIFO,有名管道特殊的文件类型:1,严格遵循先入先出的读写规则2,7、类似管道,在文件系统中不存在数据块,而是与一块内核缓冲区相关联3,有名字,FIFO的名字包含在系统的目录树结构中,可以按名访问xlanchen@2007.10.258LinuxOperatingSystemsanalysisFIFO的操作:以及:open,close,read,write等普通文件操作xlanchen@2007.10.259LinuxOperatingSystemsanalysisFIFO举例创建一个FIFO:createfifo.c向FIFO写:writefifo.c从FIFO读:readfifo.cxlanchen@2007.10.2510LinuxOperatingSy8、stemsanalysiscreatefifo.cxlanchen@2007.10.2511LinuxOperatingSystemsanalysiswritefifo.cxlanchen@2007.10.2512LinuxOperatingSystemsanalysisreadfifo.cxlanchen@2007.10.2513LinuxOperatingSystemsanalysis2、消息队列消息队列就是一个消息的链表。可以把消息看作一个记录,具有特定的格式以及特定的优先级。对消息队列有写权限的进程可以按照一定的规则向消息队列添加新消息;对消息队列有读权限的进程则可以从消息队列中读9、走消息。xlanchen@2007.10.2514LinuxOperatingSystemsanalysis消息队列的创建intmsgget(key_tkey,intmsgflg)根据给定的键值,返回对应的消息队列若能找到,则返回已有的;否则,创建一个新的xlanchen@2007.10.2515LinuxOperatingSystemsanalysis发送消息intmsgsnd(intmsqid,//目标消
5、more的输入重定向到tmp文件xlanchen@2007.10.255LinuxOperatingSystemsanalysis创建一个管道管道可看成是被打开的文件,但并没有真实的文件与之对应pipe()系统调用用来创建一个新的管道#includeintpipe(intfiledes[2]);管道两端分别用描述符filedes[0]和filedes[1]描述管道两端的功能是固定的:filedes[0]只能用于读,称为管道读端;filedes[1]只能用于写,称为管道写端。若试图从写端读,或者向读端写都将导致错误发生。一般文件的I/O函数都可用于管道,如close、re
6、ad、write等。xlanchen@2007.10.256LinuxOperatingSystemsanalysis使用管道的典型程序testpipe.c管道只能在具有亲缘关系的进程之间进行通信通过fork传递管道的描述符任意的两个进程不可能共享同一个管道无法打开已经存在的管道xlanchen@2007.10.257LinuxOperatingSystemsanalysisFIFO管道的一个重大限制是它没有名字,因此只能用于具有亲缘关系的进程间通信,在有名管道(namedpipe或FIFO)提出后,该限制得到了克服。FIFO,有名管道特殊的文件类型:1,严格遵循先入先出的读写规则2,
7、类似管道,在文件系统中不存在数据块,而是与一块内核缓冲区相关联3,有名字,FIFO的名字包含在系统的目录树结构中,可以按名访问xlanchen@2007.10.258LinuxOperatingSystemsanalysisFIFO的操作:以及:open,close,read,write等普通文件操作xlanchen@2007.10.259LinuxOperatingSystemsanalysisFIFO举例创建一个FIFO:createfifo.c向FIFO写:writefifo.c从FIFO读:readfifo.cxlanchen@2007.10.2510LinuxOperatingSy
8、stemsanalysiscreatefifo.cxlanchen@2007.10.2511LinuxOperatingSystemsanalysiswritefifo.cxlanchen@2007.10.2512LinuxOperatingSystemsanalysisreadfifo.cxlanchen@2007.10.2513LinuxOperatingSystemsanalysis2、消息队列消息队列就是一个消息的链表。可以把消息看作一个记录,具有特定的格式以及特定的优先级。对消息队列有写权限的进程可以按照一定的规则向消息队列添加新消息;对消息队列有读权限的进程则可以从消息队列中读
9、走消息。xlanchen@2007.10.2514LinuxOperatingSystemsanalysis消息队列的创建intmsgget(key_tkey,intmsgflg)根据给定的键值,返回对应的消息队列若能找到,则返回已有的;否则,创建一个新的xlanchen@2007.10.2515LinuxOperatingSystemsanalysis发送消息intmsgsnd(intmsqid,//目标消
此文档下载收益归作者所有