我在嵌入式
Linux系统上运行了二进制进程(没有可用的源代码).该进程打开一个日志文件(/tmp/dmaosd.log),在该文件中记录它正在执行的操作.
问题是日志以块的形式更新(一次大约1000个字节),因此我无法使用tail -f实时查看日志.
我想知道是否有任何方法可以强制运行进程刷新其数据(基于访问/ proc / 1234 / fd / 3)而无需访问其源并且不向其发送任何信号(我不确定是什么信号它支持也不应该做什么).
有问题的过程是媒体播放器的OSD,日志信息通常显示屏幕上选择/显示的元素,因此尽可能快地获取数据会很好.
谢谢!
解决方法
它实际上取决于缓冲区的位置:如果应用程序使用自己的日志记录缓冲区,则无法强制刷新.
如果缓冲是由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
如果需要,还可以检查文件名,并仅为您感兴趣的日志文件更改缓冲.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。