【问题标题】:how to use a persistent named pipe under linux?如何在 linux 下使用持久命名管道?
【发布时间】:2011-10-30 09:19:16
【问题描述】:

使用命名管道有时很方便,比如mkfifo file.fifo

但是 file.fifo 不是持久的,如果计算机重新启动或编写器进程崩溃,我无法从管道中获取任何信息。那么,有什么方法可以让管道数据存储在磁盘而不是内存中?

谢谢。

【问题讨论】:

  • 命名管道仅将文件系统用作命名空间和基本访问控制——这可能会产生误导。它们不是真正的文件,通过管道传递的数据永远不会存储在文件系统中。如果你需要别的东西,那么命名管道不是你要找的工具。

标签: linux persistent fifo mkfifo


【解决方案1】:

最简单的解决方案是使用纯文件来存储数据。例如,并使用管道(或类似的)来通知有新数据,例如。当然,您必须注意进程间锁定。

或者您可以使用“消息队列”(参见 mqueue.h)。它们在进程崩溃的情况下是持久的,但在系统重新启动时不会。

或者您可以使用实现“持久消息队列”的第三方库,例如MQTTRabbitMQ

【讨论】:

  • 请修复“类似问题”链接,目前已损坏。
  • @grwlf:感谢您的警告,已修复几个替代链接。 10 年过去了(!)我什至不记得写过这篇文章。
  • 文件具有完全不同的语义,因为您不能原子地释放从文件开头读取的数据。如您所述,mqueue 在重新启动时失败。 MQTT 只是一个协议,与持久性无关。 RabbitMQ 对于单台机器来说太过分了,并且默认情况下不会 fsync,即使对于“持久”消息也是如此,因此它会很乐意丢失数据。发布者确认解决了这个问题,但代价是数百毫秒的大量延迟。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-21
  • 2012-10-31
  • 2011-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多