我打算调用一个文件描述符打开到一个给定的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
也许这有助于:-)