【发布时间】:2012-03-17 14:14:05
【问题描述】:
我开发了自己的日志处理程序。为了处理来自 printk() 的日志,我从内核环形缓冲区读取如下:
#define _PATH_KLOG "/proc/kmsg"
CGR_INT kernelRingBufferFileDescriptor = open(_PATH_KLOG, O_RDONLY|O_NONBLOCK);
CGR_CHAR kernelLogMessage[MAX_KERNEL_RING_BUFFER + 1] = {'\0'};
while (1)
{
...
read(kernelRingBufferFileDescriptor, kernelLogMessage + residueSize, MAX_KERNEL_RING_BUFFER);
...
}
我的程序在用户空间。我记得每当有人使用 read() 读取环形缓冲区中的数据时(就像我上面所做的那样),读取的部分将从环形缓冲区中清除。是这样,还是不是?
我对此感到困惑,因为环形缓冲区中总是有一些东西,因此,我的程序非常忙于处理所有这些日志。所以我不确定是因为某些模块一直在向我发送日志,还是因为我一遍又一遍地读取相同的日志,因为日志没有被清除。
为了弄清楚,我使用 klogctl() 来检查环形缓冲区:
CGR_CHAR buf[MAX_KERNEL_RING_BUFFER] = {0};
int byteCount = klogctl(4, buf, MAX_KERNEL_RING_BUFFER - 1); /* 4 -- Read and clear all messages remaining in the ring buffer */
printf("%s %d: data read from kernel ring buffer = \"%s\"\n",__FILE__, __LINE__, buf);
而且我一直在获取数据。由于带有参数 4 的 klogctl() 读取并清除了环形缓冲区,我有点相信某些模块确实一直在向我发送日志。
谁能告诉我 - read() 是否清除环形缓冲区?
【问题讨论】:
标签: linux logging linux-kernel buffer