mar*_*ial 3 linux logging buffer linux-kernel
我开发了自己的日志处理程序.要处理源自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);
...
}
Run Code Online (Sandbox Code Playgroud)
我的程序在用户空间.我记得每当有人使用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);
Run Code Online (Sandbox Code Playgroud)
而且我一直在不停地获取数据.由于带有参数4的klogctl()读取并清除了环形缓冲区,我有点相信某些模块一直向我发送日志.
任何人都可以告诉我 - 读取()清除环缓冲区吗?
root用户,运行这个cat /proc/kmsg >> File1.txt
和cat /proc/kmsg >> File2.txt
.比较File1.txt
并且File2.txt
您将立即知道环形缓冲区是否在read()
cos cat
内部调用被清除read()
!
还可以在此处阅读有关环形缓冲区及其在内核文档中的行为的信息 - http://www.mjmwired.net/kernel/Documentation/trace/ring-buffer-design.txt
编辑:我在Jonathan Corbet 的书中 找到了一些有趣的东西 -Linux Device Drivers
printk函数将消息写入循环缓冲区,该缓冲区长度为 __LOG_BUF_LEN个字节:在配置内核时选择的值从4 KB到1 MB.然后,该函数唤醒正在等待消息的任何进程,即正在syslog系统调用中休眠或正在读取/ proc/kmsg的任何进程 .这两个与日志记录引擎的接口几乎是等价的,但请注意,从/ proc/kmsg读取消耗来自日志缓冲区的数据,而 syslog系统调用可以选择返回日志数据,同时将其留给其他进程.通常,读取/ proc文件更容易,并且是klogd的默认行为.的dmesg的命令可以用于看而不必将它的缓冲器的内容; 实际上,该命令返回stdout缓冲区的全部内容,无论它是否已被读取
因此,在您的特定情况下,如果您使用普通的read()
,我认为缓冲区确实已被清除,并且新数据不断被写入其中,因此您始终可以找到一些数据!内核专家可以在这里纠正我!
归档时间: |
|
查看次数: |
6997 次 |
最近记录: |