[计算机软件及应用]第8章 进程间通信.pptVIP

  • 9
  • 0
  • 约7.55千字
  • 约 67页
  • 2018-03-04 发布于浙江
  • 举报

[计算机软件及应用]第8章 进程间通信.ppt

[计算机软件及应用]第8章 进程间通信

本章的要求 第8章、 进程间通信 掌握Linux中管道的创建和读写 掌握Linux中有名管道的创建和读写 掌握Linux中信号的使用 掌握Linux中信号量的使用 掌握Linux中共享内存的使用 掌握Linux中消息队列的使用 本章的主要内容 8.1 Linux下进程间通信概述 8.2 管道 8.3 信号 8.4 信号量 8.5共享内存 8.6 消息队列 8.7 实验 8.1 Linux下进程间通信概述 Linux下进程间通信概述(1) Linux下的进程通信手段基本上是从UNIX平台上的进程通信手段继承而来的。而对UNIX发展做出重大贡献的两大主力ATT的贝尔实验室及BSD(加州大学伯克利分校的伯克利软件发布中心)在进程间的通信方面的侧重点有所不同。前者是对UNIX早期的进程间通信手段进行了系统的改进和扩充,形成了“system V IPC”,其通信进程主要局限在单个计算机内;后者则跳过了该限制,形成了基于套接口(socket)的进程间通信机制。而Linux则把两者的优势都继承了下来 Linux下进程间通信概述(2) ? UNIX进程间通信(IPC)方式包括管道、FIFO以及信号。 ? System V进程间通信(IPC)包括System V消息队列、System V信号量以及System V共享内存区。 ? Posix 进程间通信(IPC)包括Posix消息队列、Posix信号量以及Posix共享内存区。 进程间通信方式的种类(1) (1)管道(Pipe)及有名管道(named pipe):管道可用于具有亲缘关系进程间的通信,有名管道,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信。 (2)信号(Signal):信号是在软件层次上对中断机制的一种模拟,它是比较复杂的通信方式,用于通知进程有某事件发生,一个进程收到一个信号与处理器收到一个中断请求效果上可以说是一样的。 (3)消息队列(Messge Queue):消息队列是消息的链接表,包括Posix消息队列SystemV消息队列。它克服了前两种通信方式中信息量有限的缺点,具有写权限的进程可以按照一定的规则向消息队列中添加新消息;对消息队列有读权限的进程则可以从消息队列中读取消息。 进程间通信方式的种类(2) (4)共享内存(Shared memory):可以说这是最有用的进程间通信方式。它使得多个进程可以访问同一块内存空间,不同进程可以及时看到对方进程中对共享内存中数据的更新。这种通信方式需要依靠某种同步机制,如互斥锁和信号量等。 (5)信号量(Semaphore):主要作为进程之间以及同一进程的不同线程之间的同步和互斥手段。 (6)套接字(Socket):这是一种更为一般的进程间通信机制,它可用于网络中不同机器之间的进程间通信,应用非常广泛。 8.2 管道 管道概述 无名管道是Linux中进程间通信的一种方式。 ? 它只能用于具有亲缘关系的进程之间的通信(也就是父子进程或者兄弟进程之间)。 ? 它是一个半双工的通信模式,具有固定的读端和写端。 ? 管道也可以看成是一种特殊的文件,对于它的读写也可以使用普通的read()和write()等函数。但是它不是普通的文件,并不属于其他任何文件系统,并且只存在于内核的内存空间中。 管道的创建 和关闭 管道是基于文件描述符的通信方式,当一个管道建立时,它会创建两个文件描述符fds[0]和fds[1],其中fds[0]固定用于读管道,而fd[1]固定用于写管道,这样就构成了一个半双工的通道。 创建管道可以通过调用pipe()来实现。 管道关闭时只需使用普通的close()函数逐个关闭各个文件描述符。 父子进程之间的管道通信(1) 用pipe()函数创建的管道两端处于一个进程中,由于管道是主要用于在不同进程间通信的,因此这在实际应用中没有太大意义。实际上,通常先是创建一个管道,再通过fork()函数创建一子进程,该子进程会继承父进程所创建的管道 。 父子进程之间的管道通信(2) 父子进程分别拥有自己的读写通道,为了实现父子进程之间的读写,只需把无关的读端或写端的文件描述符关闭即可。此时,父子进程之间就建立起了一条“子进程写入父进程读取”的通道。 示例 阅读并运行示例8-2-2。 标准流管道 (1) 与Linux的文件操作中有基于文件流的标准I/O操作一样,管道的操作也支持基于文件流的模式。这种基于文件流的管道主要是用来创建一个连接到另一个进程的管道,这里的“另一个进程”也就是一个可以进行一定操作的可执行文件,例如,用户执行“ls -l”或者自己编写的程序“./pipe”等。由于这一类操作很常用,因此标准流管道就将一系列的创建过程合并到一个函数pope

文档评论(0)

1亿VIP精品文档

相关文档