在 Linux 下,如何强制进程刷新写入打开文件描述符的数据?

在 Linux 下,如何强制进程刷新写入打开文件描述符的数据?

我在嵌入式 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

如果您愿意,您还可以检查文件的名称并仅更改您感兴趣的日志文件的缓冲。

相关内容