7

我正在寻找一个打开给定管道的文件描述符的子进程,这样 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 等)或以标志打开的 C 包装器执行此操作的机制/tmp/foobar.pipeO_NONBLOCK显而易见的;如果可能的话,我正在寻找一种纯 bash 解决方案。

4

2 回答 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 提供了这个指针。

于 2008-10-07T17:12:31.267 回答
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

也许这有帮助:-)

于 2008-10-07T16:39:20.493 回答