The following code, when connected to the terminal’s stdio, interleaves
the outputs in time-order.
When I pipe the stdout or redirect to a file, all the “B” outputs are
grouped at the top (in time order), followed by the “A” outputs.
I assume this is due to buffering in the child processes. What can I do
to make the piped/redirected output behave like terminal output?
$ ruby -v
ruby 1.9.0 (2004-01-08) [i686-linux]
···
$stdout.sync
START_TIME = Time.now.to_f
fork do
srand 1
10.times do
sleep rand
puts "A: #{Time.now.to_f - START_TIME}"
end
end
fork do
srand 2
10.times do
sleep rand
puts "B: #{Time.now.to_f - START_TIME}"
end
end
Process.wait
Process.wait