我想知道如何与永无止境(永恒循环)的子进程进行交互。
loop_puts.rb的源代码,子进程:
loop do
str = gets
puts str.upcase
end
主.rb :
Process.spawn("ruby loop_puts.rb",{:out=>$stdout, :in=>$stdin})
我想放一些字母,而不是通过我的手输入,并在变量中得到结果(不是以前的结果)。
我该怎么做?
谢谢
有很多
方法可以做到这一点,如果没有更多的上下文,很难推荐一种。
以下是使用分叉进程和管道的一种方法:
# 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的一些文档在这里。 请注意,这可能不适用于所有平台。
实现此目的的其他可能方法包括命名管道、drb 和消息队列。