Я работаю над сценарием, который использует IO.popen для открыть другую программу и постоянно читать данные. Это примерно так:
process = IO.popen(["/the/program", "argument", "argument"])
loop do
line = process.gets
puts "#{line}"
end
(Фактическая программа делает больше, чем просто выводит результат, очевидно - это всего лишь пример.)
Проблема, с которой я столкнулся, заключается в том, что popen, похоже, буферизует STDOUT из открытого процесса. Я подтвердил это, запустив программу прямо из оболочки и через popen, параллельно, а Ruby никогда не получает по одной строке за раз. Он всегда получает несколько строк за раз и задерживается.
Я пробовал
STDOUT.sync = true
... перед открытием, но это ничего не изменило.
Данная программа определенно использует \ n как новая строка, так что проблема не в этом.