Я использую Ruby для запуска команды оболочки, которая создает большой двоичный файл (ГБ). В следующем коде cmd
обрабатывает stdin
и создает stdout
известного формата.
Извлечение кода:
sm_out = File.open(rad_output_file, "wb")
record_size = 33 # 8 bytes string + tab + 6 x 8 bytes floats
Open3.popen2(cmd) do |stdin, stdout, wait_thr|
stdin.puts scene_inp.pack("F*")
stdin.close_write
while record = stdout.read(record_size)
# record_data = record.pack("A8xffffff")
sm_out.write(record_data)
end
wait_thr.value
end
sm_out.close
scene_inp
- массив чисел с плавающей запятой.
В конечном коде мне нужно обработать stdout
одну строку (или одну запись) за раз. Чтобы проверить это, я написал приведенный выше код, который должен записывать вывод в файл.
Код зависает в Open3, и нет вывода. После небольшого исследования я понимаю, что труба заполняется, и из-за этого процесс cmd
зависает. Закрытие stdin
должно решить эту проблему, но, очевидно, я делаю что-то не так.
Просто для проверки, если я перенаправлю cmd
в файл, он будет работать как положено.