我有一个embedded式Linux系统上运行的二进制进程(没有可用的源代码)。 该进程将打开一个日志文件(/tmp/dmaosd.log),在该文件中logging正在执行的操作。
问题是日志以块的forms更新(每次大约1000字节),所以我不能使用tail -f实时查看日志。
我想知道是否有办法强制运行进程刷新其数据(基于访问/ proc / 1234 / fd / 3),而无需访问其源和不发送任何信号(我不知道什么信号它支持,也不应该做什么)。
这个过程是一个媒体播放器的OSD,日志信息通常显示在屏幕上select/显示哪些元素,因此,尽可能快地获取数据将是非常好的。
谢谢!
这实际上取决于缓冲区的位置:如果应用程序使用自己的日志logging缓冲区,则无法强制刷新。
如果缓冲由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
如果你想的话,你也可以检查文件的名称,并改变缓冲只为你感兴趣的日志文件。