我发现你不能以任何方式共享变量(甚至不是$
全局变量)并且你必须使用管道,所以我会切入追逐。
有两个进程:进程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
答案 0 :(得分:0)
IO#read
在EOF之前读取。由于你没有发送EOF(也就是说,你没有关闭作者),它永远不会返回。您可以尝试使用reader.gets
和writer.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