3

我手头有一个问题,需要我将命令提示符作为不同的进程生成并向其发送一些命令并捕获/解析命令输出。这种交互需要采用父子进程的形式,也就是说所有命令都可以放在一个 ruby​​ 文件中,并且在运行 ruby​​ 文件时,命令被发送到控制台(命令提示符)并从中接收输出并在 ruby​​ 脚本中处理。

我要遵循的一般逻辑是:

  1. 使用 fork 生成不同的进程并获取进程 ID
  2. 获取流程的流
  3. 写入进程的输入流并从输出流中读取。

我使用的环境是安装了 Ruby 1.9.2 的 Windows XP 机器。我下载了在这里找到的 win32-process 库。通过使用该库,我可以按如下方式执行第 1 步

require 'win32/process'
    APP_NAME = "C:\\Windows\\system32\\cmd.exe"
    process_info = Process.create(:app_name => APP_NAME,
      :creation_flags => Windows::Process::CREATE_NEW_CONSOLE,
      :process_inherit  => false,
      :thread_inherit   => true,
      :cwd => "C:\\"
    )

由于 win32-process 库是基于在 windows 上使用进程和线程的,因此我尝试通过MSDN帮助查看它。在阅读创建控制台文章时,我发现 GetStdHandle 方法可用于获取输入和输出流的句柄。但是,我在 win32 进程中的任何地方都找不到这种方法。

有人可以为我提供一些关于如何进行步骤 2 和 3 的指导吗?

另外,有没有其他方法可以用来解决手头的问题?

另外,我想了解更多关于进程间通信或一般进程的产生和分叉的信息,所以有人可以告诉我一些我可以研究它们的好的参考吗?

提前致谢

4

1 回答 1

3

这是一个在 Windows 中使用 IO.popen 的示例,imo 如果它与 stdlib 一起使用,请不要使用 gem

IO.popen("other_program", "w+") do |pipe|
  pipe.puts "here, have some input"
  pipe.close_write  # If other_program process doesn't flush its output, you probably need to use this to send an end-of-file, which tells other_program to give us its output. If you don't do this, the program may hang/block, because other_program is waiting for more input.
  output = pipe.read
end

# You can also use the return value from your block. (exit code stored in $? as usual)
output = IO.popen("other_program", "w+") do |pipe|
  pipe.puts "here, have some input"
  pipe.close_write
  pipe.read
end
于 2012-06-05T18:10:54.357 回答