分叉进程之间的数据交换

时间:2014-02-03 20:50:07

标签: ruby

我发现你不能以任何方式共享变量(甚至不是$全局变量)并且你必须使用管道,所以我会切入追逐。

有两个进程:进程A从某处获取输入(可能是命令行中的管道)并将其发送到Process(fork)B,它将每秒打印最后一个给定值。 这基本上是我需要的简单基本版本。我试图这样做,但它没有显示任何输出。我无法弄清楚原因。

这是源代码:

#!/usr/bin/ruby

# create two pipes.
reader, writer = IO.pipe

fork do
        loop do
                # print the last received value every second (or so)
                puts "Last name is:  #{reader.read }"
                sleep 1
        end 
end

fork do
ARGF.each_line do |e| 
                name = e.chomp
                #send the data through the pipe
                writer.write name 
        end 

#make sure all forks are killed
Process.waitall

为了获得所需的输入,您可以输入一个示例脚本:

#!/usr/bin/ruby

arr = ['Sally', 'Mike', 'John', 'Steve', 'Iana', 'That guy']

loop do
        puts  arr[rand(5)]
        sleep 1
        STDOUT.flush
end

并简单地管道:

./generate_input.rb | ./program.rb

1 个答案:

答案 0 :(得分:0)

没有长度参数的

IO#read在EOF之前读取。由于你没有发送EOF(也就是说,你没有关闭作者),它永远不会返回。您可以尝试使用reader.getswriter.puts之类的内容一次写入一行数据。

像这样的东西会按预期工作:

reader, writer = IO.pipe

fork do
  loop do
    # print the last received value every second (or so)
    puts "Last name is:  #{reader.gets }"
    sleep 1
  end
end

fork do
  ARGF.each_line do |e|
    name = e.chomp
    #send the data through the pipe
    writer.puts name
  end
end

#make sure all forks are killed
Process.waitall