我开发了自己的日志处理程序.要处理源自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()读取并清除了环形缓冲区,我有点相信某些模块一直向我发送日志.
任何人都可以告诉我 – 读取()清除环缓冲区吗?