io/select_waits_for_another_process.rb
tests/_examples/io/select_waits_for_another_process.rb in the metorex repository.
require "etc"
p Etc.nprocessors.is_a?(Integer)
pipes = 2.times.map { IO.pipe }
pids = pipes.each_with_index.map do |(reader, writer), index|
fork do
pipes.each { |r, _| r.close }
sleep(index.zero? ? 0.2 : 0.0)
writer.write("worker #{index}\n")
writer.close
exit!(0)
end
end
pipes.each { |_, w| w.close }
readers = pipes.map(&:first)
received = []
until readers.empty?
ready, = IO.select(readers)
ready.each do |reader|
line = reader.gets
if line
received << line.chomp
else
readers.delete(reader)
end
end
end
pids.each { |pid| Process.wait(pid) }
p received
Output:
true
["worker 1", "worker 0"]