2011-09-12 60 views
3

我試圖港口一些Python代碼類似下面的紅寶石:有沒有像Python的pty.fork 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。但它似乎沒有一個等效的分叉方法;我必須以字符串的形式傳遞一個命令。這是我能得到的最接近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()」不會阻塞父進程,這就是爲什麼我將其卡在子進程中的原因。

+0

你想在子fork中獲得cmd,exec它,然後返回終端fids到主叉? –

回答