我在嵌入式 Linux 系统上运行了一个二进制进程(没有可用的源代码)。该进程打开一个日志文件 (/tmp/dmaosd.log),记录它正在执行的操作。
问题是日志是分块更新的(每次大约 1000 字节),所以我无法使用 tail -f 实时查看日志。
我想知道是否有任何方法可以强制正在运行的进程刷新其数据(基于访问 /proc/1234/fd/3),而无需访问其源并且不向其发送任何信号(我不确定它支持什么信号也不确定它们应该做什么)。
所讨论的过程是媒体播放器的 OSD,日志信息通常显示屏幕上选择/显示的元素,因此尽快获取数据会很好。
谢谢!
答案1
这实际上取决于缓冲区的位置:如果应用程序使用其自己的日志缓冲区,那么就无法强制刷新。
如果缓冲是由 C 库完成的,那么您可以使用 LD_PRELOAD 来禁用缓冲。假设程序正在使用fopen()
打开其日志文件,您可以执行以下操作:
#define _GNU_SOURCE 1
#include <dlfcn.h>
#include <stdio.h>
static FILE* (*libc_fopen)(char const *, char const *);
FILE * fopen(char const *name, char const *mode) {
FILE *ret;
if (!libc_fopen)
libc_fopen = dlsym(RTLD_NEXT, "fopen");
ret = libc_fopen(name, mode);
if (!ret)
return ret;
setvbuf(ret, NULL, _IONBF, 0);
return ret;
}
编译为共享库,然后使用 LD_PRELOAD“注入”到程序中:
LD_PRELOAD=./nobuffering.so myprogram
如果您愿意,您还可以检查文件的名称并仅更改您感兴趣的日志文件的缓冲。