Когда вы выполняете разветвление, дочерний процесс будет содержать клон открытого файла родителя, с любыми данными, ожидающими в своем буфере. Когда ребенок выходит, он сбрасывает эти данные и закрывает свой открытый файл. Это не влияет на открытые файлы родителей или братьев и сестер, но, поскольку они все отображаются в одно и то же ядро, все данные поступают в один и тот же выходной файл.
В первый раз через fork нет ожидающих результатов, так что потомок не будет ничего писать, когда он существует. Во второй раз есть ожидание «0 \ n», которое будет записано при выходе, в следующий раз буферизация «0 \ n1 \ n» и т. Д. Разветвленные процессы могут не завершиться в порядке их создания ( они асинхронные), следовательно, ваши перемешанные результаты.
Вилы сохраняют открытые файлы и сокеты, поэтому нужно быть осторожным, чтобы тщательно управлять ими.
Вероятно, вы можете исправить это поведение, сказав ruby сбрасывать вывод при каждой записи вместо буферизации.
class Recorder
def initialize(notifier, filename)
notifier.add_observer(self)
@save_file = File.open(filename, 'w')
@save_file.sync = true # don't buffer this file
@i = 0
end
end