1、简介
在前面的两章,我们介绍了各种类型的进程通信,包括管道和套接字。在这一个章节我们将会看到两个高级的通信方式:基于流管道的IPC以及Unix域套接字,以及我们可以对它们进行怎样的操作。通过这些形式的IPC,我们可以将打开的文件描述符号在进程之间进行传递,服务进程可以将名称和这些文件描述符号进行关联,客户进程可以使用这些名称和服务进程之间进行通信。我们也会看到,操作系统如何为每一个客户进程提供单一的IPC通道。
译者注
原文参考
2、基于流的管道
基于流的管道(简称“流管道”即stream pipe),是一个全双工的管道,父子进程之间通过单一的管道就可以进行双向的通信。
前面已经说过,Solaris系统支持stream pipes,而linux上面可以通过一个可选的软件包来提供这样的功能。
stream pipe简介
下图用两种方式展示了stream pipes:
+-----User Process----+ +---User Process-----+
| | | |
| fd[0] fd[1] | |fd[0] fd[1]|
+----^----------^-----+ +-^---------------^--+
\ / | |
-------- +-----|---------------|------+
| +->Stream Pipe<-+ |
+-----------Kernel-----------+
如果我们深入Stream pipe内部,将会看到两个stream头部,每一个写队列(WQ)指向另一个读队列(RQ)。对一端写入数据,将会放到另外一端读取队列的消息中去。
Stream pipe 的内部
+---------+ +---------+
| +----+ | | +----+ |
| | WQ |---------\ /----------| WQ | |
| +----+ | \ / | +----+ |
fd[0] | | \/ | | fd[1]
| +----+ | /\ | +----+ |
| | RQ |<---------/ \---------->| RQ | |
| +----+ | | +----+ |
+---------+ +---------+
Stream head Stream head
由于Stream pipe是一个流,我们可以将streams模块推送到管道的任何一段来处理写入管道的数据,后面会给出相应的图形。但是如果我们将一个模块推送到一端,我们不能从另外一端将它弹出来。如果我们想要移走它,那么我们需要从推送它的那一端将它移走。
含有Module的Stream pipe 的内部
+---------+ +---------+ +---------+
| +----+ | | +----+ | | +----+ |
| | WQ |--------------->| WQ |--------\ /-----------------| WQ | |
| +----+ | | +----+ | \ / | +----+ |
fd[0] | | | | \/ | | fd[1]
| +----+ | | +----+ | /\ | +----+ |
| | RQ |<-------------- | RQ |<--------- ------------------>| RQ | |
| +----+ | | +----+ | | +----+ |
+---------+ +---------+ +---------+
Stream head module Stream head
假设我们没有做任何事情,例如推送一个模块。一个stream pipe的表现好象是一个无stream的pipe,当然它还是支持streamio(7)中所说的多数的STREAMS的ioctl命令的。在后面的章节中,我们将会看到一个例子,这个了例子展示了当我们在文件系统中给定一个管道名称的时候,通过向streams pipe推送一个模块来提供唯一的连接。
网友评论