CHAPTER 2 进程通信.pptVIP

  • 12
  • 0
  • 约1.62万字
  • 约 86页
  • 2018-04-30 发布于河南
  • 举报
CHAPTER 2 进程通信

中南大学软件学院 第二章 进程通信 第二章 进程通信 进程通信的定义:进程间的信息交换。 1.同一物理节点上进程通信 绝大多数UNIX系统提供管道,共享内存和消息队列的方法。 2.不同物理节点上进程通信 通过通信网络实现通信,必须规定一套通信协议。 2.1 同一节点上的进程间通信 大多数UNIX系统提供多种进程通信方式,主要有: 信号(Signal); 管道(pipe); 命名管道(FIFO); 消息队列(message queue); 信号灯(semaphore); 共享内存(shared memory) 内存映象(memory mapped file)。 管道 管道通常被用作单向的通信信道,该信道将一个进程与另一个进程连接在一起。 管道提供了一种简单的,同步的进程之间传送消息的方式。 管道可以分为两类:无名管道和命名管道。 1.无名管道 无名管道只能在有亲缘关系的进程之间使用(例如父进程和子进程,子进程和子进程),并且与创建无名管道的进程一起存在。 在程序设计中,可以通过Pipe系统调用来创建管道。如果成功,该调用返回两个文件描述符:一个向管道写入,一个从管道读出。 无名管道实例 管道可以看成是被打开的文件,但是并没有真实的文件与之对应 pipe()系统调用用来创建一个新的管道 Pipe返回两个文件描述符, filedes[0]只能从管道读,filedes[1]只能向管道写 #include unistd.h #include stdio.h #define MSGSIZE 16 char *msg1 = “hello, book #1”; char *msg2 = “hello, book #2”; char *msg3 = “hello, book #3”; main() { char inbuf[MSGSIZE]; int p[2], j; if(pipe(p) == -1) { perror(“pipe call failed”); exit(1); } switch(pid=fork()) { case –1: perror(“fork call failed”); exit(2); case 0: /* if child then write to pipe*/ write(p[1], msg1, MSGSIZE); write(p[1], msg2, MSGSIZE); write(p[1], msg3, MSGSIZE); default: /*if parent then read from pipe*/ for(j=0; j3; j++) { read(p[0], inbuf, MSGSIZE); printf(“%s\n”, inbuf); } wait(NULL); exit(0); } 无名管道的特点 管道是一个强大的进程间通信机制,但它也有一些缺点。 首先:管道只能用来连接具有亲属关系的进程,例如,一个父进程和一个子进程。 其次:管道不能是永久的,它必须在每次需要的时候被创建,并且在访问它的终止后被销毁。 FIFO或命名管道 命名管道作为拥有文件访问权限的目录入口而存在,所以它们可以在彼此无关的进程之间使用。 这种通信机制涉及到read和write在内的操作,FIFO和管道是赞同的,它在进程之间作为一个先入先出的通信渠道。 大多数情况下,对FIFO进行的程序设计与对普通管道进行的编程基本相同。 命名管道的创建和使用 FIFO的操作: 以及:open,close,read,write等普通文件操作。 FIFO或命名管道实例 #include sys/types.h #include sys/stat.h #include fcntl.h …. Mkfifo(“/tmp/fifo”, 0666); …… fd=open(“/tmp/fifo”, O_WRONLY); 消息队列 队列中的消息能够以随意的顺序进行检索,因为可以通过消息的类型把消息从队列中检索出来。 消息队列是一个消息的链接列表,消息都保存在内核中。如果一个消息添加到一个队列,队列显示出FIFO特性,新消息被添加到队列末尾。 创建和打开消息队列 int open_queue(key_t key) { int qid; if((qid=msgget(key,IPC_CREAT|0660))==-1) { return(-1); } return(qid); } 向队列中写入消息 int send_message(int qi

文档评论(0)

1亿VIP精品文档

相关文档