对于已运行且具有已知 PID 的进程,从外部刷新管道/printf 缓冲区

mvo*_*sek 3 shell pipe buffer file-descriptors

我正在编写一个数据记录应用程序,所有程序的启动方式如下:

./program > out.bin
Run Code Online (Sandbox Code Playgroud)

数据收集器定期汇集 stdout 输出文件并读取数据。

问题是 IO 流被缓冲,如果某些程序以每秒 1 个字节的速度输出数据,则需要很长时间(默认 4k​​B 缓冲区大小,最多需要 4k 秒)才能实际刷新数据。

我的问题是如何强制 stdout/pipe/printf 缓冲区从外部刷新,即从外部调用类似fflush(stdout).

我读过各种网站,例如Turn off buffering in pipeline,但我无法禁用缓冲区,因为它对 IO 性能有巨大的影响(测量)。

我正在寻找高性能的生产解决方案,并且始终满足以下条件:

  • 程序(数据生产者)PID 始终已知
  • 输出始终是具有已知路径的文件
  • 数据记录进程具有完全root访问权限

小智 5

gdb -p PID -batch -ex 'p fflush(stdout)'
Run Code Online (Sandbox Code Playgroud)

与任何调试和黑客攻击一样,YMMV。