有没有类似Python的pty.fork for Ruby?

时间:2011-09-12 20:17:03

标签: python ruby linux fork pty

我正在尝试将以下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

由于我需要像终端一样读写子进程,我知道我应该使用Ruby的PTY模块来代替Kernel.fork。但它似乎没有等效的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%肯定它会起作用。当然Ruby有更清洁的东西吗?

重要的是“get_command_based_on_user_input()”不会阻止父进程,这就是为什么我把它放在子进程中。

1 个答案:

答案 0 :(得分:0)

您可能正在寻找http://ruby-doc.org/stdlib-1.9.2/libdoc/pty/rdoc/PTY.htmlhttp://www.ruby-doc.org/core-1.9.3/Process.html#method-c-forkCreate a daemon with double-fork in Ruby

我打开一个带有主进程的PTY,使用STDIN.reopen将fork重新连接到PTY上。