/* Интерфейс glibc */
#include <sys/klog.h> int klogctl(int type, char *bufp, int len); /* Непосредственно системный вызов */
#include <unistd.h>
#include <linux/unistd.h> _syscall3(int, syslog, int, type, char *, bufp, int, len); int syslog(int type, char *bufp, int len);
Параметр type определяет действие выполняемое этой функцией.
Вырезка из файла kernel/printk.c:
/* * Команды sys_syslog: * * 0 -- Закрыть системный журнал. В настоящий момент не работает. * 1 -- Открыть системный журнал. В настоящий момент не работает. * 2 -- Прочитать содержимое журнала. * 3 -- Прочитать до 4-х Кб последних сообщений ядра из кольцевого буфера. * 4 -- Прочитать и очистить до 4-х Кб последних сообщений ядра из кольцевого буфера * 5 -- Очистить кольцевой буфер. * 6 -- Запретить вывод printk на консоль * 7 -- Разрешить вывод printk на консоль * 8 -- Установить уровень сообщений, выводимых на консоль * 9 -- Возврат числа непрочитанных символов в буфере журнала */Несуперпользовательским процессам разрешено вызывать только функцию номер 3. (Функция 9 была добавлена в 2.4.10.)
Буфер системного журнала
В ядре существует кольцевой буфер длиной LOG_BUF_LEN
(4096, начиная с ядра 1.3.54: 8192, начиная с 2.1.113: 16384l
в последних ядрах размер может быть изменен при сборке ядра),
где содержатся сообщения ядра, представленные в виде параметра к
функции printk() (независимо от их уровня журналирования).
Системный вызов
syslog
(2,buf,len)
ожидает появления сообщения в буфере и затем записывает максимум
len байтов в буфер buf. После этого она возвращает
количество прочитанных байтов. Байты, прочитанные из журнала, исчезают
из буфера: информацию в нем можно прочесть только один раз.
Эта функция исполняется при чтении пользовательской программой
файла
/proc/kmsg.
Системный вызов
syslog
(3,buf,len)
читает последние len байтов из буфера журнала (не разрушая его),
но не больше, чем было записано в буфер с момента вызова команды
"очистка кольцевого буфера" (которая на самом деле буфер не очищает).
Этот вызов возвращает количество прочитанных байтов.
Системный вызов
syslog
(4,buf,len)
выполняет то же самое, но еще вызывает команду
"очистка кольцевого буфера".
Системный вызов
syslog
(5,dummy,idummy)
просто исполняет команду "очистка кольцевого буфера".
Уровень сообщений ядра в журнале
Функция ядра printk() выводит сообщение на консоль только
в том случае, если его уровень меньше
console_loglevel
(по умолчанию установленное значение которого равно DEFAULT_CONSOLE_LOGLEVEL (7), но
это значение будет равно 10-и, если командная строка ядра
содержит слово `debug', и 15-и в случае ошибки ядра;
эти значения не имеют большого смысла и аналогичны 8-и).
Значение переменной (из диапазона от единицы до восьми) устанавливается системным
вызовом
syslog
(8,dummy,value).
Системные вызовы
syslog
(type,dummy,idummy)приусловии,что
type равно 6-и или 7-и, устанавливают это значение равным единице
(только при критических сообщениях ядра) или 7-и (при всех сообщениях, кроме
отладочных) соответственно.
Каждая строка текста в сообщении имеет свой уровень. Этот уровень
равен DEFAULT_MESSAGE_LOGLEVEL - 1 (6), если только строка не начинается с <d>,
где d - это цифра в диапазоне от единицы до 7-и: в этом случае
уровень равен d. Значения уровня заданы в
<linux/kernel.h>
следующим образом:
#define KERN_EMERG "<0>" /* система не пригодна к использованию */ #define KERN_ALERT "<1>" /* необходимо немедленно принять меры */ #define KERN_CRIT "<2>" /* критическая ошибка */ #define KERN_ERR "<3>" /* ошибка */ #define KERN_WARNING "<4>" /* предупреждение */ #define KERN_NOTICE "<5>" /* обычное, но важное событие */ #define KERN_INFO "<6>" /* информационное сообщение */ #define KERN_DEBUG "<7>" /* отладочное сообщение */
Закладки на сайте Проследить за страницей |
Created 1996-2024 by Maxim Chirkov Добавить, Поддержать, Вебмастеру |