Popen的例子,我不明白

问题描述 投票:1回答:1

我之前对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模式中STDOUTpopen.rb)将是writable end的管道和STDINtext_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如何在这里工作而在我之前的例子中不起作用。

谢谢

ruby popen
1个回答
1
投票

不同之处在于popen的第二个论点:"w""w+"。你可以阅读更多here in the docs

“w”只写,将现​​有文件截断为零长度或创建用于写入的新文件。

“w +”读写,将现有文件截断为零长度或创建用于读写的新文件。

“截断”的概念并不真正适用于管道,但事实上您需要读写模式。

© www.soinside.com 2019 - 2024. All rights reserved.