设置pipe道从命名pipe道读取而不用bash中的阻塞

我打算调用一个文件描述符打开到一个给定的pipe道的subprocess,使open()调用不会挂起等待pipe道的另一端接收连接。

展示:

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

在这种情况下, some_program不会运行,直到某个进程打开/tmp/foobar.pipe打开才能写入; 然而, some_program即使在没有接收到命令时some_program产生有用的效果,因此some_program被期望的行为被立即执行。

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

设置管道时打开FD读取/写入而不是只读,可防止阻塞。

要更具体些:

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

防止不希望的阻塞行为,因为5<>/tmp/foobar.pipe在RW模式下打开(与5</tmp/foobar.pipe以只读模式打开5</tmp/foobar.pipe ),尽管仍然设置了O_NONBLOCK 。 感谢这个指针的irc://irc.freenode.org/#bash上的waldner。

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

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

也许这有助于:-)