Использование Ruby для управления другим процессом? - PullRequest
0 голосов
/ 29 января 2012

Я бы хотел управлять отдельным процессом с помощью классической системы меню 1), 2), 3) и т. Д. По аналогии с передачей входного файла для управления процессом, я хотел бы использовать Ruby для управления процессом '$ stdin и $ stdout. Я экспериментировал с IO.popen и Open3.popen3, но не могу заставить его работать. Примеры документации не ясны (но я также довольно новичок в такого рода программировании).

Основная идея:

Open3.popen3("./server") do |stdin,stdout,stderr|
  stdout.gets
  stdin.puts "1"
  stdout.gets
  stdin.puts "2"
  stdout.gets
end

В настоящее время первый stdout.gets получает правильный заголовок, но затем программа зависает. Кто-нибудь может дать совет? Я уже некоторое время гуглю, но ничего не нашел.

Спасибо!

1 Ответ

1 голос
/ 29 января 2012

IPC (межпроцессное взаимодействие) является очень сложным. При работе с IPC необходимо очищать буфер после каждой операции записи. Это будет выглядеть так:

Open3.popen3("./server") do |stdin,stdout,stderr|
  stdout.gets
  stdin.puts "1"
  stdin.flush
  stdout.gets
  stdin.puts "2"
  stdin.flush
  stdout.gets
end

Это ужасно, но вы можете переопределить puts как одноэлементный метод для stdin (вы можете сделать то же самое с print и write, если необходимо):

class <<stdin
  old_puts=method(puts)
  def puts(str)
    old_puts[str]
    flush
  end
end

Это избавит вас от многих неприятностей, если вы делаете много IPC.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...