Попен пример, который я не понимаю - PullRequest
0 голосов
/ 22 февраля 2019

До сих пор у меня было базовое понимание 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 работает здесь и не работает в моем предыдущем примере.

Спасибо

1 Ответ

0 голосов
/ 22 февраля 2019

Разница во втором аргументе: popen: "w" против "w+".Вы можете прочитать больше здесь в документации :

"w" Только для записи, обрезает существующий файл до нулевой длины или создает новый файл для записи.

"w +" Чтение-запись, усечение существующего файла до нулевой длины или создание нового файла для чтения и записи.

Понятие "усечение" на самом деле не относится к каналам, но фактчто вам нужно в режиме чтения-записи.

...