3

コマンドプロンプトを別のプロセスとして生成し、いくつかのコマンドをそれに送信し、コマンド出力をキャプチャ/解析する必要があるという問題があります。この相互作用は、すべてのコマンドを ruby​​ ファイルに入れることができ、ruby ファイルを実行すると、コマンドがコンソール (コマンド プロンプト) に送信され、そこから出力が受信されるという親子プロセスの形式である必要があります。 Rubyスクリプトで処理されます。

私が従う一般的なロジックは次のとおりです。

  1. フォークを使用して別のプロセスを生成し、プロセス 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-process のどこにも実装されているのを見つけることができませんでした。

手順 2 と 3 を進める方法について、誰かが私にガイダンスを提供できますか?

また、目前の問題を解決するために使用できる他の方法はありますか?

また、プロセス間通信または一般的なプロセスのスポーンとフォークについて詳しく知りたいので、誰かがそれらを研究できる良い参考文献を教えてもらえますか?

前もって感謝します

4

1 に答える 1

3

ここでは、WindowsでIO.popenを使用する例、stdlibで動作する場合はimoを使用します。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 に答える