我需要从ruby中启动一个子进程,接管然后返回控制权。这个子进程需要用户的交互式输入,所以它的io应该与stdin stdout和stderr绑定。此外,它还会根据不同的情况请求输入变化。
这样的程序例子是TeX,我会启动一个文件,但是在这个过程中TeX可能会遇到一个用户错误,它必须查询用户如何解决。
从本质上讲,我正在寻找一个再入版的exec.NET程序。
PS
对于那些不能仔细阅读的人,让我重申一下。
这个子进程需要用户的交互式输入。
这意味着,如果ruby程序在tty中运行,它的输出是去tty而不是Ruby程序,它的输入是来自tty而不是Ruby程序。
换句话说。本质上,我在寻找一个再进入版本的exec.
我以TeX为例,让我给你看一个例子。我在at上找到了一个TeX的例子。样品文本 . 我打算放一个错误,但似乎我不必放,它使我的系统窒息。把它保存在sample1.tex,sample2.tex,sample3.tex中。
现在我想运行这段ruby代码。
files=["sample1.tex","sample2.tex","sample3.tex"]
files.each{|file|
# It is really a latex command.
commmand_that_I_am_looking_for("latex #{file}")
}
当我运行这段代码时,我应该在终端机上看到三遍一堆东西:
乳胶程序的一般信息,处理进度等等
! LaTeX Error: File `html.sty' not found.
Type X to quit or <RETURN> to proceed,
or enter new name. (Default extension: sty)
Enter file name:
其中在这三次中,每一次程序都会等待用户输入一些东西。
Ruby标准库有一个特殊的命令来满足你的需求。它被称为 open3
. 下面是其文档中的一个例子。
Open3.popen3("pwd", :chdir=>"/") {|stdin, stdout, stderr, thread|
p stdout.read.chomp #=> "/"
}
你可以将 fork
与 exec
:
Process.fork { exec('./somescript') }
Process.wait
负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: Process.wait
确保你等待子进程完成。