【发布时间】:2015-02-04 02:00:53
【问题描述】:
我正在处理a flow-based programming system called net2sh。它目前基于通过命名管道连接的 shell 工具。多个进程协同工作以完成工作,通过命名管道进行通信,这与工厂中的生产线不同。
总的来说,它运行良好,但存在一个主要问题。在进程通过两个或多个命名管道进行通信的情况下,“发送”进程和“接收”进程必须以相同的顺序打开管道。这是因为当一个进程打开一个命名管道时,它会阻塞直到另一端也被打开。
我想要一种方法来避免这种情况,无需为每个管道生成额外的“帮助”进程,无需破解现有组件,也无需为了避免此问题而弄乱程序网络。
理想情况下,我正在寻找一些“非阻塞 fifo”选项,其中 fifo 上的“open”总是立即成功,但如果管道缓冲区已满(或为空,用于读取),后续操作可能会阻塞......我' d 甚至考虑使用内核补丁来达到这种效果。根据 fifo(7) O_NONBLOCK 在打开 fifos 时确实做了一些不同的事情,而不是我想要的,为了使用它,我必须重写所有现有的 shell 工具,例如 cat。
这是一个死锁的最小示例:
mkfifo a b
(> a; > b; ) &
(< b; < a; ) &
wait
如果你能帮助我明智地解决这个问题,我将非常感激!
【问题讨论】:
标签: linux shell unix named-pipes fifo