资源描述:
《CHAPTER 2 进程通信》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、第二章进程通信第二章进程通信进程通信的定义:进程间的信息交换。1.同一物理节点上进程通信绝大多数UNIX系统提供管道,共享内存和消息队列的方法。2.不同物理节点上进程通信通过通信网络实现通信,必须规定一套通信协议。7/17/202122.1同一节点上的进程间通信大多数UNIX系统提供多种进程通信方式,主要有:信号(Signal);管道(pipe);命名管道(FIFO);消息队列(messagequeue);信号灯(semaphore);共享内存(sharedmemory)内存映象(memorymappedfile)。7/17/20213管道管道通常被用作单向的通信信道,该信道将一个进程与另一
2、个进程连接在一起。管道提供了一种简单的,同步的进程之间传送消息的方式。管道可以分为两类:无名管道和命名管道。7/17/202141.无名管道无名管道只能在有亲缘关系的进程之间使用(例如父进程和子进程,子进程和子进程),并且与创建无名管道的进程一起存在。在程序设计中,可以通过Pipe系统调用来创建管道。如果成功,该调用返回两个文件描述符:一个向管道写入,一个从管道读出。7/17/20215无名管道实例管道可以看成是被打开的文件,但是并没有真实的文件与之对应pipe()系统调用用来创建一个新的管道Pipe返回两个文件描述符,filedes[0]只能从管道读,filedes[1]只能向管道写7/1
3、7/20216#include#include#defineMSGSIZE16char*msg1=“hello,book#1”;char*msg2=“hello,book#2”;char*msg3=“hello,book#3”;main(){charinbuf[MSGSIZE];intp[2],j;if(pipe(p)==-1){perror(“pipecallfailed”);exit(1);}无名管道实例Description:filedes[0]isforreading,filedes[1]isforwriting.ReturenValue:Ons
4、uccess,zeroisreturned.Onerror,-1isreturned,anderrnoissetappropriately.7/17/20217switch(pid=fork()){case–1:perror(“forkcallfailed”);exit(2);case0:/*ifchildthenwritetopipe*/write(p[1],msg1,MSGSIZE);write(p[1],msg2,MSGSIZE);write(p[1],msg3,MSGSIZE);default:/*ifparentthenreadfrompipe*/for(j=0;j<3;j++){
5、read(p[0],inbuf,MSGSIZE);printf(“%s”,inbuf);}wait(NULL);exit(0);}无名管道实例7/17/20218无名管道的特点管道是一个强大的进程间通信机制,但它也有一些缺点。首先:管道只能用来连接具有亲属关系的进程,例如,一个父进程和一个子进程。其次:管道不能是永久的,它必须在每次需要的时候被创建,并且在访问它的终止后被销毁。7/17/20219FIFO或命名管道命名管道作为拥有文件访问权限的目录入口而存在,所以它们可以在彼此无关的进程之间使用。这种通信机制涉及到read和write在内的操作,FIFO和管道是赞同的,它在进程之间作为一
6、个先入先出的通信渠道。大多数情况下,对FIFO进行的程序设计与对普通管道进行的编程基本相同。7/17/202110命名管道的创建和使用FIFO的操作:以及:open,close,read,write等普通文件操作。7/17/202111FIFO或命名管道实例#include#include#include….Mkfifo(“/tmp/fifo”,0666);……fd=open(“/tmp/fifo”,O_WRONLY);Despcrition:Createnamedpipes(FIFOs)withthegivenNAMEs.
7、模式指定权限模式(类似chmod),而不是a=rw减umask7/17/202112消息队列队列中的消息能够以随意的顺序进行检索,因为可以通过消息的类型把消息从队列中检索出来。消息队列是一个消息的链接列表,消息都保存在内核中。如果一个消息添加到一个队列,队列显示出FIFO特性,新消息被添加到队列末尾。7/17/202113创建和打开消息队列intopen_queue(key_tkey){intqid;if((