Emscripten - Есть ли способ записи газа на стандартный вывод? - PullRequest
4 голосов
/ 13 февраля 2020

Я использую инструмент C, скомпилированный для wasm с использованием emscripten. Инструмент работает с очень большими файлами. При нормальном запуске этого инструмента в интерфейсе командной строки часто выполняются операции потоковой передачи результатов и преждевременного завершения программы, как только возвращается достаточно данных. Например, вы можете выполнить:

./tool <input-file> | head -n 100

Инструмент завершит работу после того, как обнаружит, что стандартный вывод был закрыт head, фактически считывая только небольшую часть ввода.

Проблема в том, что стандартный вывод с emscripten выглядит асинхронным (путем переопределения Module.print), поэтому инструмент каждый раз запускается до завершения. Есть ли способ заблокировать его на стандартном выводе, чтобы я мог читать только столько, сколько мне нужно, а затем завершить работу инструмента?

1 Ответ

0 голосов
/ 14 февраля 2020

Вы можете перенаправить вывод в файл и затем поставить задачу в фоновом режиме. Тем временем следите за лог-файлом. Когда он достигнет 100 строк, убейте дочерний pid.

Примерно так должно работать:

rm -f /tmp/log
touch /tmp/log
./tool input_file > /tmp/log 2>&1 &
pid=$!

while sleep 1
do
    ret=`cat /tmp/log | wc -l`
    if [ "$ret" -ge 100 ]
    then
        kill $pid
        exit 0
    fi
done

Я прикоснулся, чтобы создать пустой файл журнала. Это позволит избежать состояния гонки, в котором мы его определяем до того, как он будет создан дочерним процессом. w c -l вернет количество строк. Измените значение сна на то, которое подходит для вашего времени тестирования.

...