我希望使用打开给定管道的文件描述符调用子进程,这样 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
的 C 包装器执行此操作的机制与 O_NONBLOCK
标志很明显;我正在寻找一种纯 bash 解决方案,如果可能的话。
最佳答案
在设置管道时以读/写方式打开 FD 而不是只读方式可以防止阻塞。
更具体一点:
$ mkfifo /tmp/foobar.pipe
$ some_program --command-fd=5 5<>/tmp/foobar.pipe
防止不希望的阻塞行为,如5<>/tmp/foobar.pipe
尽管 5</tmp/foobar.pipe
以 RW 模式打开(与以只读模式打开相反 O_NONBLOCK
)仍然设置。感谢 irc://irc.freenode.org/#bash 上的 waldner 提供此指针。
关于bash - 设置从命名管道读取的管道而不阻塞 bash,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/179291/