我想知道如何与永无止境(永恒循环)的子进程进行交互。
loop_puts.rb的源代码,子进程:
loop do
str = gets
puts str.upcase
end
main.rb:
Process.spawn("ruby loop_puts.rb",{:out=>$stdout, :in=>$stdin})
我想写一些字母,而不是用手打字,并在变量中得到结果(不是以前的结果)。
我该怎么做?
感谢
答案 0 :(得分:0)
有很多方法可以做到这一点,很难推荐没有更多背景的方法。
这是使用分叉进程和管道的一种方式:
# 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的一些文档。请注意,这可能不适用于所有平台。
其他可能的方法包括Named Pipes,drb和message queues。