javascript - Emscripten - 有没有办法限制写入标准输出?
问题描述
我正在运行一个使用 emscripten 编译为 wasm 的 C 工具。该工具适用于非常大的文件。在 CLI 上正常运行此工具时,操作通常会流式传输结果并在返回足够的数据后提前终止程序。例如,您可能会运行:
./tool <input-file> | head -n 100
该工具将在检测到 stdout 已被 关闭后终止head
,实际上只读取输入的一小部分。
问题是带有 emscripten 的 stdout 似乎是异步的(通过覆盖 Module.print),因此该工具每次都运行完成。有没有办法让它在标准输出上阻塞,所以我只能读取我需要的内容,然后终止该工具?
解决方案
您可以将输出重定向到文件,然后将任务置于后台。同时监控日志文件。当它达到 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
我创建了一个空的日志文件。这将避免在子进程创建它之前我们对其进行 cat 处理的竞争条件。wc -l 将返回行数。将睡眠值更改为适合您的测试时间的值。
推荐阅读
- python - 端口 5432 上的 django..db.utils.operationserror
- java - 我如何过滤此映射以生成更优雅和干净的 sql 更新?
- r - `/.default`(residuals, sigmas) 中的错误:不一致的数组
- javascript - 更新后以错误的 MIME 类型发送的 React Build Stylesheets 和 Js 文件
- google-apps-script - Getting the error note of a formula with #NA in google sheets for a script
- html - 样式化组件 (DIV) 上的 onClick 事件处理
- django - How can I run an existing Django application?
- ruby-on-rails - ERROR: Error installing rails zeitwerk requires Ruby version >= 2.4.4
- python - 发送邮件时显示错误,例如,AttributeError: 'int' object has no attribute 'splitlines'
- google-cloud-platform - 在 gcloud 中将 JSON 文件作为环境变量传递