美文网首页LinuxLinux学习之路
APUE读书笔记-17高级进程通信(1)

APUE读书笔记-17高级进程通信(1)

作者: QuietHeart | 来源:发表于2020-08-05 18:35 被阅读0次

    1、简介

    在前面的两章,我们介绍了各种类型的进程通信,包括管道和套接字。在这一个章节我们将会看到两个高级的通信方式:基于流管道的IPC以及Unix域套接字,以及我们可以对它们进行怎样的操作。通过这些形式的IPC,我们可以将打开的文件描述符号在进程之间进行传递,服务进程可以将名称和这些文件描述符号进行关联,客户进程可以使用这些名称和服务进程之间进行通信。我们也会看到,操作系统如何为每一个客户进程提供单一的IPC通道。

    译者注

    原文参考

    参考: APUE2/ch17lev1sec1.html

    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推送一个模块来提供唯一的连接。

    相关文章

      网友评论

        本文标题:APUE读书笔记-17高级进程通信(1)

        本文链接:https://www.haomeiwen.com/subject/ahhwrktx.html