设置从命名管道读取的管道而不阻塞bash

时间:2008-10-07 16:25:06

标签: bash unix shell pipe

我正在寻找一个子程序,其中一个文件描述符被打开到给定的管道,这样open()调用就不会挂起,等待管道的另一端接收连接。

演示:

$ mkfifo /tmp/foobar.pipe
$ some_program --command-fd=5 5</tmp/foobar.pipe

在这种情况下,some_program在某个进程打开/tmp/foobar.pipe以进行写入之前不会运行;但是,some_program即使在没有接收命令时也会产生有用的效果,因此需要立即执行some_program行为。

通过执行备用脚本语言(python,perl等)或使用/tmp/foobar.pipe标志打开O_NONBLOCK的C包装器来执行此操作的机制是显而易见的;我正在寻找一种纯粹的bash解决方案,如果有可能的话。

2 个答案:

答案 0 :(得分:9)

在设置管道时打开FD读/写而不是只读会阻止阻塞。

更具体一点:

$ mkfifo /tmp/foobar.pipe
$ some_program --command-fd=5 5<>/tmp/foobar.pipe

可以防止意外的阻塞行为,因为5<>/tmp/foobar.pipe在RW模式下打开(而不是像5</tmp/foobar.pipe那样以只读模式打开),尽管O_NONBLOCK仍然设置。感谢waldner on irc://irc.freenode.org/#bash这个指针。

答案 1 :(得分:3)

我知道得到这种结果的唯一方法是黑客攻击:

mkfifo /tmp/foobar.in
mkfifo /tmp/foobar.out
( cat </tmp/foobar.in ) >/tmp/foobar.out &
some_program --command-fd=5 5</tmp/foobar.out

也许这会有所帮助: - )