10

有没有办法在 shell 中创建非阻塞/异步命名管道或类似的东西?这样程序就可以在其中放置行,这些行将保留在 ram 中,并且当某些程序可以从管道中读取某些行时,将未读取的内容留在 fifo 中?程序也很可能可以同时写入和读取该 fifo。起初我虽然也许这可以使用文件来完成,但在网上搜索了一下之后,似乎没有什么好处可以来自文件同时读取和写入的事实。命名管道几乎可以工作,只是有两个问题:首先,如果另一端没有人,它们会阻塞读/写,其次,即使我让写入阻塞并设置两个进程写入管道,而没有人在读,通过尝试为每个进程写一行,然后尝试head -n 1 <fifo>我只得到了我需要的一行,但是两个写入过程都终止了,第二行丢失了。有什么建议么?

编辑:也许可以使用一些中间程序来帮助解决这个问题,充当作家和读者之间的调解人?

4

1 回答 1

5

您可以为此目的使用特殊程序 - 缓冲区。缓冲区旨在尝试保持写入端持续忙碌,以便在写入磁带驱动器时可以流式传输,但您可以将其用于其他目的。内部缓冲区是一对通过共享内存中保存的大型循环队列进行通信的进程,因此您的进程将异步工作。如果队列已满而编写器进程将被阻止,您的读取器进程将被阻止 - 以防队列为空。例子:

bzcat 存档.bz2 | 缓冲区-m 16000000 -b 100000 | 处理脚本 | bzip2 > archive_processed.bz2

http://linux.die.net/man/1/buffer

于 2011-07-14T06:17:58.110 回答