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

标签 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 的 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/

相关文章:

linux - bash脚本: command not found

Unix uniq -c 转csv格式

android - 如何输入命令到CTS-Tradefed?

linux - 用于检查 ubuntu 版本然后复制文件的 shell 脚本

bash - 为什么/bin/kill 的有效信号与 kill 不同?

linux - 如果死了就开始进程

bash - shell :在 ubuntu 12.04 上安装 gawk

xml - 如何从命令行漂亮地打印 XML?

linux - 你如何解释 ${VAR#* :*:*} in Bourne Shell

bash - 使用 sed 删除算术形式