【问题标题】:Techniques for infinitely long pipes无限长管道的技术
【发布时间】:2010-07-28 06:27:04
【问题描述】:

有两种非常简单的方法可以让一个程序向另一个程序发送数据流:

  • Unix 管道,或 TCP 套接字,或类似的东西。这需要消费者程序不断关注,否则生产者程序会阻塞。即使增加缓冲区通常很小的默认值,这仍然是一个大问题。
  • 普通文件 - 生产者程序附加O_APPEND,消费者只是在方便时读取任何可用的新数据。这不需要任何同步(只要磁盘空间可用),但 Unix 文件只支持在末尾截断,而不是在开头截断,因此它会填满磁盘直到两个程序退出。

有没有一种简单的方法可以同时使用,将数据存储在磁盘上直到被读取,然后释放?显然程序可以通过数据库服务器或类似的东西进行通信,并且没有这个问题,但我正在寻找与普通 Unix 管道完美集成的东西。

【问题讨论】:

    标签: unix pipe


    【解决方案1】:

    一个相对简单的手卷解决方案。

    您可以让生产者创建文件并继续写入,直到达到一定的记录大小/数量,无论适合您的应用程序。然后,生产者关闭文件并使用约定的命名算法启动一个新文件。

    消费者从文件中读取新记录,然后在达到约定的最大大小时关闭并取消链接,然后打开下一个。

    【讨论】:

      【解决方案2】:

      如果您的数据可以拆分为某种块或交易,您可以使用带有序列号的文件方法。数据生产者将第一兆字节的数据存储在outfile.1中,下一个兆字节存储在outfile.2中等等。消费者可以按顺序读取文件并在读取时将其删除。因此,您会得到类似于您的第二种方法的东西,并在此过程中进行清理。

      您可能应该将所有这些都包装在一个库中,这样从应用程序的角度来看,这某种管道。

      【讨论】:

        【解决方案3】:

        您应该阅读一些documentation on socat。您可以使用它来弥合 tcp 套接字、fifo 文件、管道、stdio 和其他之间的差距。

        如果你觉得懒惰,这里有 some nice examples 的有用命令。

        【讨论】:

        • 我查看了文档,但不清楚如何使用 socat 来满足我的需求。假设为简单起见,我只有一个生产者和一个消费者,并且希望它们之间有无限的管道。我该如何使用 socat 呢?
        【解决方案4】:

        我什么都不知道,但是编写一个将目录作为参数(或使用 $TMPDIR)的小实用程序应该不会太难;并且,使用 select/poll 在从标准输入读取、分页到一系列临时文件和写入标准输出之间进行多路复用。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-09-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多