第11章 UNIX进程之间的通信.ppt_第1页
第11章 UNIX进程之间的通信.ppt_第2页
第11章 UNIX进程之间的通信.ppt_第3页
第11章 UNIX进程之间的通信.ppt_第4页
第11章 UNIX进程之间的通信.ppt_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、UNIX进程间通信机制用于解决进程间的信息交换,协调进程的前进速度。UNIX系统中的进程通信包括流水线、消息缓冲区、共享内存和信号量机制。11.1管道(pipes)管道通信是通过文件以先进先出的方式在进程之间进行同步数据传输的一种形式。有两种类型的管道:未命名管道和著名管道(先进先出)。匿名管道用于通过先进先出规则在父子或两个兄弟进程之间传输信息。管道必须由父进程创建。众所周知,流水线通常用于实现进程间无父子关系的大量信息传输。第11章UNIX进程之间的通信。管道文件是一个临时文件。通信完成后,文件不再存在。流水线通信的方式是一个进程用写命令将数据写入流水线,另一个进程用读命令读取流水线中的数

2、据。读写必须同步。1.创建匿名管道的系统调用当同一系列的进程需要通过管道进行通信时,系统调用管道()来建立匿名管道。它的调用语法如下:管道(fdp)这里,fdp是一个指针数组。记录管道读写的两个文件描述符。实现过程是在管道文件所在的设备上分配一个I节点,并在主内存中分配一个活动的I节点,其文件类型为IFIFO。在系统打开文件表中为调用进程分配了两个条目,分别用FREAD和FWRITE填充以指示流水线的读写,并使f_inode指向内存I节点。同时,在用户打开文件表中创建两个条目,以指向系统打开文件表中的两个条目。为管道文件的主内存I节点设置初始值:I_count=2和I _ frcnt=1;I_

3、fwcnt=1 .文件描述符通过数组fdp返回给调用进程。管道文件中没有路径名,它由管道文件所在设备上的I节点、相应的主内存I节点、两个系统打开文件条目和两个需要生成管道文件的进程打开文件表的条目组成。开始时,文件长度为0,是一个空白文件。管道文件的数据结构如下图所示。限制管道文件的大小:管道文件仅使用索引节点中的直接地址条目,其长度限制为10个块。核心将直接地址条目作为循环队列进行管理,并将诸如读指针(I_frptr)、写指针(I_fwptr)、读流水线中的进程数(I_frcnt)、写流水线中的进程数(I_fwcnt)和等待使用标志(I_fflag)等信息放入剩余的三个索引条目中,并以先进先

4、出的顺序执行读和。进程互斥:所有进程都相互排斥对管道文件的索引节点中的直接地址项的访问。加一把锁。然后创建一个或多个子进程。此时,子进程复制父进程的用户打开的文件表,因此管道文件由父进程和子进程(或同一系列的进程之间)共享。之后,每个进程关闭管道文件的发送器和接收器,并通过调用READ()或WRITE()函数来访问管道文件。为了避免混淆,最好将一个管道文件用于两个进程,一个用于读取,一个用于写入。这样,形成了图11.2(p227)所示的结构。通信完成后,使用close命令CLOSE()将其关闭,并恢复文件占用的所有系统资源。文件一旦关闭,就不再存在。创建命名管道命名管道命名管道是一个临时文件。

5、当文件关闭时,文件不再存在,只能用于同一系列进程之间的通信。UNIX系统v提供了一个众所周知的管道来实现非同构进程之间的通信。著名的管道可以用于同一台机器的进程之间的本地通信,也可以用于通过网络连接的不同机器的进程之间的通信。调用语法如下:mknod(pathname,mode,dev),其中pathname是新创建的著名管道的文件路径名,mode是所创建文件的类型和访问模式,dev是文件所在的设备。在创建了一个著名的管道之后,系统中有一个目录条目和相应的外部存储I节点,但是它没有打开。只要这个文件不被删除,它就会像普通文件一样永久存在,除了文件冷2打开一个著名的管道因为该著名的管道在创建时没

6、有被打开,所以必须显式地使用下面的打开系统调用来打开文件。打开(pathname,oflg),其中pathname是要打开的已知管道的路径名,oflg是打开文件时的访问模式。通信的发送方以只写模式打开著名的管道,而接收方以只读模式打开。在一个著名的管道打开后,通信双方使用读写命令进行通信,并在通信完成后立即关闭。当命名管道文件关闭时,它占用的所有磁盘块都会被释放,但该文件仍然占用一个目录条目和一个I节点。除了文件长度是0。当使用著名的管道实现进程间的通信时,必须有三个同步。第一次是打开同步。当一个进程通过阅读打开了一个著名的管道,如果一个作者已经打开了它,唤醒这个作者并继续前进;否则,睡觉等作

7、家。当一个过程通过写作打开了一个著名的管道,如果它已经被读者打开,它将唤醒读者并继续前进。否则,睡眠等待读者。第二次是读写同步。同步与管道相同。作者被允许带领读者1024个字符。当作者写作时,检查读者是否在等待,如果是,醒来后再写。当管道已满时,编写器必须休眠并等待。当读者从著名的频道阅读时,如果没有数据可读,他们会睡觉并等待。如果有数据要读取,请检查写入器是否正在等待读取,如果是,请唤醒写入器。读者和作者都必须随时检查对方是否仍然存在,一旦一方不存在,沟通过程应该立即终止。第三次是关闭同步。当一个写进程关闭一个著名的流水线时,如果发现一个进程正在休眠并等待从流水线中读取,那么它就被唤醒,并且

8、被唤醒的进程立即从读取调用中返回。当读取进程关闭一个著名的管道时,如果它发现一个进程正在休眠并等待写入该管道,它会唤醒它,向它发送一个指示错误情况的信号并返回。最后一个进程关闭著名的流水线,并释放所有被流水线占用的磁盘块和相应的主内存I节点。示例:在示例1中,父子进程之间使用匿名管道通信,char parent= a message from parent . n main()int chan 12;char buf100管道(chan 1);如果(叉()关闭(chan 10);*父进程关闭读通道*写通道(chan11,父进程,sizeof(父进程);关闭(chan 11);打印(“父进程终止

9、符”);否则关闭(chan 11);*子进程关闭写通道*读(chan10,buf,100);printf(“子进程read:sn”,buf);关闭(chan 10);printf(“子进程终止符”);示例2任何两个进程都通过一个著名的管道进行通信。main(argc,argv)int argc;char * argvint fdchar buf256,MK nod(“FIFO”,010777,0);*在读写执行模式下为所有用户创建一个著名的流水线*如果(argc=2) FD=打开(“先进先出”,o _ wronly);*通信发送器以只写模式打开*否则FD=打开(“先进先出”,只写0);*在只读

10、模式下,如果(argc=2)写(fd,string,2 ),通信接收器打开;printf(“我写了:%s”,字符串);string 0=1;关闭(FD);否则读取(fd,buf,6);(我已经读了:buf);buf0=0关闭(FD);著名的流水线程序的运行模式:一个进程使用”。/a . exe 1 key _ t key;用户指定的消息队列的名称是int msgflg用户设置的标志和访问模式返回消息队列描述符消息的发送:int msgsnd (msgid、msgp、msgsz、msgflg);int msgid消息队列描述符结构msgbuf * msgp。指向消息缓冲区的指针。msgflg中消息的长度;当没有存储消息的存储空间时,等待?放回去?消息接收:int msgrev (msgid、msgp、msgsz、msgtpy、ms

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论