Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unix 无限长管道技术_Unix_Pipe - Fatal编程技术网

Unix 无限长管道技术

Unix 无限长管道技术,unix,pipe,Unix,Pipe,有两种非常简单的方法可以让一个程序向另一个程序发送数据流: Unix管道、TCP套接字或类似的东西。这需要消费者节目的持续关注,否则制作人节目将被屏蔽。即使增加缓冲区的默认值,这仍然是一个巨大的问题 普通文件-生产者程序附加了O_APPEND,消费者只需读取方便时可用的任何新数据。这不需要任何同步(只要磁盘空间可用),但Unix文件只支持在结束时截断,而不支持在开始时截断,因此它将填满磁盘,直到两个程序都退出 有没有一种简单的方法可以同时使用这两种方法,将数据存储在磁盘上,直到它被读取,然后

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

  • Unix管道、TCP套接字或类似的东西。这需要消费者节目的持续关注,否则制作人节目将被屏蔽。即使增加缓冲区的默认值,这仍然是一个巨大的问题
  • 普通文件-生产者程序附加了
    O_APPEND
    ,消费者只需读取方便时可用的任何新数据。这不需要任何同步(只要磁盘空间可用),但Unix文件只支持在结束时截断,而不支持在开始时截断,因此它将填满磁盘,直到两个程序都退出
有没有一种简单的方法可以同时使用这两种方法,将数据存储在磁盘上,直到它被读取,然后被释放?显然,程序可以通过数据库服务器或类似的方式进行通信,并且没有这个问题,但我正在寻找与普通Unix管道很好地集成的程序。

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


如果你感到懒惰,有很多有用的命令。

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

您可以让制作者创建文件并继续写入,直到它达到某个大小/记录数为止,只要适合您的应用程序即可。然后,生产者关闭该文件,并使用约定的命名算法启动一个新文件


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

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


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

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

我查看了文档,不清楚如何使用socat实现我想要的功能。让我们简单地说,我有一个生产者和一个消费者,希望他们之间有无限的管道。我如何使用socat来实现这一点?