0

終わりのない(永遠にループする)子プロセスとどのようにやり取りできるのだろうか。

loop_puts.rb のソースコード、子プロセス:

loop do
    str = gets
    puts str.upcase
end

main.rb :

Process.spawn("ruby loop_puts.rb",{:out=>$stdout, :in=>$stdin})

手で入力するのではなく、文字を入れて、結果(以前の結果ではない)を変数に入れたいと思います。

これどうやってするの?

ありがとう

4

1 に答える 1

0

これを行うにはいくつかの方法があり、コンテキストがなければ 1 つを推奨することは困難です。

フォークされたプロセスとパイプを使用する 1 つの方法を次に示します。

# When given '-' as the first param, IO#popen forks a new ruby interpreter.  
# Both parent and child processes continue after the return to the #popen 
# call which returns an IO object to the parent process and nil to the child.
pipe = IO.popen('-', 'w+')
if pipe
  # in the parent process
  %w(please upcase these words).each do |s|
    STDERR.puts "sending:  #{s}"
    pipe.puts s   # pipe communicates with the child process
    STDERR.puts "received: #{pipe.gets}"
  end
  pipe.puts '!quit'  # a custom signal to end the child process
else
  # in the child process
  until (str = gets.chomp) == '!quit'
    # std in/out here are connected to the parent's pipe
    puts str.upcase
  end
end

IO#popen hereのいくつかのドキュメント。これはすべてのプラットフォームで機能するとは限らないことに注意してください。

これにアプローチする他の可能な方法には、名前付きパイプdrb、およびメッセージ キューが含まれます。

于 2013-10-26T08:39:28.817 に答える