在 Linux 运行时重定向 FIFO
Posted
技术标签:
【中文标题】在 Linux 运行时重定向 FIFO【英文标题】:Redirecting FIFO in runtime in Linux 【发布时间】:2017-01-24 14:10:30 【问题描述】:我正在尝试使用 POSIX IPC 在 Linux 下的 C++ 中实现运行时可重新配置的 IPC。在当前配置中,我有一个进程 A 通过 FIFO 与进程 B 通信。进程 B 从 FIFO 中获取数据,进行一些修改并通过另一个 FIFO 将它们发送到另一个进程 C。这是一个图形表示:
然后,在运行时我想杀死进程 B,并能够允许进程 A 通过 B 和 C 之间的 FIFO 发送数据:
我该怎么做?
【问题讨论】:
关闭进程A中已有的FIFO,打开进程C使用的只写模式? 【参考方案1】:如果你杀死一个进程,它打开的文件描述符都会被关闭。因此,如果您杀死 B,这将导致 C 看到 FIFO 上出现 EOF。但是,如果您有一个在 B 关闭后仍然存在的命名 FIFO,C 可以继续从与 FIFO 关联的文件描述符中读取,尽管它会立即连续返回EOF,直到另一端重新打开。
另一种选择是让 B 将其输出发送回 A,然后 A 将该输出转发给 C。这样,它将始终控制发送给 C 的内容,并且 C 不必担心其 FIFO 被关闭并且重新打开。
【讨论】:
是的,我已经通过这种方式解决了关闭程序和丢失描述符的问题。我的问题更多是关于是否有可能在不干扰进程 A 和 C 的情况下在两个 FIFO 之间建立软件链接(一种软链接)。我认为最好的解决方案是通知进程 A 进程 B 正在关闭并且使用它的 FIFO 成为 C 的一个。以上是关于在 Linux 运行时重定向 FIFO的主要内容,如果未能解决你的问题,请参考以下文章
.NET 实现启动时重定向程序运行路径及 Windows 服务运行模式部署