无限长管道的技术

时间:2010-07-28 06:27:05

标签: unix pipe

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

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

是否有一种简单的方法可以同时使用它,数据存储在磁盘上直到它被读取,然后释放?显然,程序可以通过数据库服务器或类似的东西进行通信,而不会出现这个问题,但我正在寻找能够与普通Unix管道集成良好的东西。

4 个答案:

答案 0 :(得分:3)

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

你可以让制作人创建文件并继续写,直到它达到一定大小/数量的记录,无论你的应用程序是什么。然后,生产者关闭文件并使用商定的命名算法启动一个新文件。

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

答案 1 :(得分:1)

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

您应该将所有这些包装在库中,以便从应用程序的角度来看, 是某种管道。

答案 2 :(得分:0)

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

如果你感到懒惰,那就有some nice examples个有用的命令。

答案 3 :(得分:0)

我不知道任何事情,但编写一个以目录作为参数(或使用$ TMPDIR)的小实用程序应该不会太难;并且,使用select / poll在从stdin读取,分页到一系列临时文件和写入stdout之间进行多路复用。