使用systemu而不是open3的好处?

时间:2011-10-27 19:05:07

标签: ruby

systemu页面说:

  

systemu可以在任何平台上使用,以返回任何命令的status,stdout和stderr。与open3 / popen4等其他方法不同,完整管道或线程问题不会挂起你的进程或子进程。

(https://github.com/ahoward/systemu)

有人能解释一下吗?

1 个答案:

答案 0 :(得分:2)

方法like popen及其各种衍生产品很方便,是完整I / O库的预期API的一部分。

但是,它们必须随意或小心使用,因为它们容易出现死锁。顺便说一句,我的意思是,如果你同时从命令中写入和读取,只要你不写很多或者不读很多,它仍然可以。谨慎地说,我的意思是,您可以移动大量数据,但前提是您要记住操作的内部细节并故意设计防止死锁。

想象一下,将大量内容写入 popened 命令然后读取结果。如果你写的多个管道将缓冲,那么你的进程将会休眠。在大多数情况下,这在实践中是可以的,但如果命令必须编写很多内容呢?现在可能会睡眠而不能完成您正在发送的输入。您将无法完成发送输入,因此您永远不会醒来并阅读结果。

死锁!