我之前对popen
有基本的了解,但它似乎完全改变了。请参考示例了解原因?
# process.rb
IO.popen("ruby test_ex.rb","w") do |io|
io.write("#{Process.pid} hello")
io.close_write
## this does not work.
##io.readlines
end
## text_ex.rb
def readWrite
@string = gets()
puts "#{Process.pid} -- #{@string}"
end
readWrite
现在我理解在write
模式中STDOUT
(popen.rb
)将是writable end
的管道和STDIN
(text_ex.rb
)将是管道的readable end
。
一切都很好。
但是,让我们看看另一个例子
my_text = IO.popen("ssh user@host 'bash'", "w+")
my_text.write("hostname")
my_text.close_write
my_rtn = my_text.readlines.join('\n')
my_text.close
puts my_rtn
好的,现在这里有什么不同? popen
开始一个儿童过程(即ssh
)发送hostname
。
现在,我无法理解子进程的STDOUT
(即ssh)如何可用于父进程,即readlines
如何在这里工作而在我之前的例子中不起作用。
谢谢
不同之处在于popen
的第二个论点:"w"
与"w+"
。你可以阅读更多here in the docs:
“w”只写,将现有文件截断为零长度或创建用于写入的新文件。
“w +”读写,将现有文件截断为零长度或创建用于读写的新文件。
“截断”的概念并不真正适用于管道,但事实上您需要读写模式。