在Bash中设置从命名管道读取而不阻塞的管道。

7
我希望调用一个子进程,其中包含已经打开到给定管道的文件描述符,以便open()调用不会因等待管道另一端接收连接而挂起。
举个例子:
$ mkfifo /tmp/foobar.pipe
$ some_program --command-fd=5 5</tmp/foobar.pipe

在这种情况下,只有当某个进程以写方式打开 /tmp/foobar.pipe 时,才会运行 some_program; 然而,即使没有接收到命令,some_program 也具有有用的效果,因此期望的行为是立即执行 some_program
通过执行替代脚本语言(python、perl等)或使用打开 /tmp/foobar.pipe 时带有 O_NONBLOCK 标志的 C 包装器来实现这一点的机制是显而易见的;我正在寻找一个纯 bash 解决方案,如果可能的话。
2个回答

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。感谢irc://irc.freenode.org/#bash上的waldner提供此指针。


3
我知道的唯一实现这种结果的方法是一个hack:
mkfifo /tmp/foobar.in
mkfifo /tmp/foobar.out
( cat </tmp/foobar.in ) >/tmp/foobar.out &
some_program --command-fd=5 5</tmp/foobar.out

也许这可以帮助你 :-)

你说得对,那是个错别字。我刚刚修改了它。是的,这个后台进程很丑陋,这就是为什么我称其为 hack :) - Sec

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接