Я разработал собственную программу обработки журналов. чтобы обрабатывать журналы, созданные в 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);
и я постоянно получаю данные. Поскольку klogctl () с аргументом 4 считывает и очищает кольцевой буфер, я полагаю, что какой-то модуль ДОЛЖЕН постоянно отправлять мне журналы.
Может кто-нибудь сказать мне - читает () очистить кольцевой буфер?