Есть ли что-то вроде Pyty's pty.fork для Ruby? - PullRequest
3 голосов
/ 13 сентября 2011

Я пытаюсь перенести некоторый код Python, как показано ниже, на Ruby:

import pty

pid, fd = pty.fork
if pid == 0:
  # figure out what to launch
  cmd = get_command_based_on_user_input()

  # now replace the forked process with the command
  os.exec(cmd)
else:
  # read and write to fd like a terminal

Поскольку мне нужно читать и писать в подпроцесс, как терминал, я понимаю, что вместо Kernel.fork я должен использовать модуль PTY Руби. Но, похоже, у него нет эквивалентного метода fork; Я должен передать команду в виде строки. Это самое близкое, что я могу получить к функциональности Python:

require 'pty'

# The Ruby executable, ready to execute some codes
RUBY = %Q|/proc/#{Process.id}/exe -e "%s"|

# A small Ruby program which will eventually replace itself with another program. Very meta.
cmd = "cmd=get_command_based_on_user_input(); exec(cmd)"

r, w, pid = PTY.spawn(RUBY % cmd)
# Read and write from r and w

Очевидно, что некоторые из них связаны с Linux, и это нормально. И, очевидно, некоторые из них - псевдокод, но это единственный подход, который я могу найти, и я только на 80% уверен, что он все равно будет работать. Конечно, у Руби есть что-то чище?

Важно то, что "get_command_based_on_user_input ()" не блокирует родительский процесс, поэтому я вставил его в дочерний процесс.

1 Ответ

0 голосов
/ 10 ноября 2011

Вы, вероятно, ищете http://ruby -doc.org / stdlib-1.9.2 / libdoc / pty / rdoc / PTY.html , http://www.ruby -doc.org / core-1.9.3 / Process.html # method-c-fork и Создание демона с двойным форком в Ruby .

Я бы открыл PTY с мастер-процессом, разветвил и прикрепил дочерний элемент к указанному PTY с помощью STDIN.reopen.

...