Linux   发布时间:2022-04-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了log-files – 如何强制进程刷新写入Linux下的打开文件描述符的数据?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

概述

我在嵌入式 Linux系统上运行了二进制进程(没有可用的源代码).该进程打开一个日志文件(/tmp/dmaosd.log),在该文件中记录它正在执行的操作. 问题是日志以块的形式更新(一次大约1000个字节),因此我无法使用tail -f实时查看日志. 我想知道是否有任何方法可以强制运行进程刷新其数据(基于访问/ proc / 1234 / fd / 3)而无需访问其源并且不向其发送任何信号(我不
@H_197_10@
我在嵌入式 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

如果需要,还可以检查文件名,并仅为您感兴趣的日志文件更改缓冲.

大佬总结

以上是大佬教程为你收集整理的log-files – 如何强制进程刷新写入Linux下的打开文件描述符的数据?全部内容,希望文章能够帮你解决log-files – 如何强制进程刷新写入Linux下的打开文件描述符的数据?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。