我正在创建一个流程,该流程将通过命名管道发布数据,并且我设想有多个订阅者。有什么方法可以让我的进程在每次新订阅者尝试打开管道时关闭命名管道吗?
编辑以求清晰 我正在尝试使用广播模型。
- 我不会区分有 1 个还是 N 个订阅者。
- 我确实关心是否没有订阅者。如果没有人在听,我会关闭部分系统。
- 我不关心处理数据。一旦有人订阅,我希望他们能够获得完整的数据集。
- 订阅者不应获得任何旧数据。一旦他们打开管道,他们应该会看到像流一样的新数据。
答案1
首先,标题中的问题:
多个进程可以打开命名管道吗?
答案是肯定的。我的意思是,同时有不止一位读者和不止一位作者。
现在你的实际问题是:
是否有某种方法可以让我的进程在每次新订阅者尝试打开管道时关闭它正在写入的命名管道?
我不确定你所说的“开球”是什么意思,但这是一个一般性的答案:
- 因为打开管道进行写入是一种阻塞操作,直到其他人打开它进行读取,并且因为写入没有读取器的管道会触发 SIGPIPE,所以您的写入器(发布者)可以确定至少有一个读取器(订户)。
另一方面,编写器无法知道在给定时间是否有多个读取器(您可以通过使用以下命令监视 fifo 活动来缓解此问题inotify
, 尽管) - 发布者发送的消息不能针对特定读者。
- 发布者编写的消息内容不会在读者之间重复(即每个读者都会收到作者发送的相同消息)。相反,每个读者都会阅读其中的一部分。例如,如果您将“HELLO WORLD”写入具有三个订阅者(读者)的管道,则第一个订阅者可能会收到“HELL”,第二个可能会收到“LORD”,最后一个可能会收到“O W”
[编辑] 现在您已经澄清了您的问题,我上面写的内容仍然适用,我们可以得出结论:命名管道显然不是满足您需求的正确工具。您可能需要广播/多播 UDP 套接字,或者专用的消息系统,例如D总线,AMQP经纪人等