syslog, klogctl - читает и/или очищает кольцевой буфер сообщений ядра, устанавливает console_loglevel
НАЗВАНИЕsyslog, klogctl - читает и/или очищает кольцевой буфер
сообщений ядра, устанавливает console_loglevel
СИНТАКСИС
/* Интерфейс glibc */
#include
int klogctl(int type, char *bufp, int len);
/* Непосредственно системный вызов */
#include
#include
_syscall3(int, syslog, int, type, char *, bufp, int, len);
int syslog(int type, char *bufp, int len);
ОПИСАНИЕ
Если вам необходима функция libc syslog(), (которая
описывает syslogd(8)), то смотрите syslog(3). Системный
вызов с этим именем предназначен для управления буфером
printk() ядра, glibc версия этой функции называется
klogctl().
Параметр type определяет действие выполняемое этой
функцией.
Вырезка из файла kernel/printk.c:
/*
* Команды sys_syslog:
*
* 0 -- Закрыть системный журнал. В настоящий момент не работает.
* 1 -- Открыть системный журнал. В настоящий момент не работает.
* 2 -- Прочитать содержимое журнала.
* 3 -- Прочитать до 4-х Кб последних сообщений ядра из кольцевого буфера.
* 4 -- Прочитать и очистить до 4-х Кб последних сообщений ядра из кольцевого буфера
* 5 -- Очистить кольцевой буфер.
* 6 -- Запретить вывод printk на консоль
* 7 -- Разрешить вывод printk на консоль
* 8 -- Установить уровень сообщений, выводимых на консоль
*/
Несуперпользовательским процессам разрешено вызывать
только функцию номер 3. Буфер системного журнала
В ядре существует кольцевой буфер длины LOG_BUF_LEN (4096;
начиная с ядра 1.3.54, она равна 8192, начиная с 2.1.113,
длина равна 16384), в котором содержатся сообщения ядра,
представленные в виде параметра функции 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), если только строка не
начинается с
до 7-и: в этом случае уровень равен d. Значения уровня
заданы в следующим образом:
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
При удачном завершении, если type равен 2-м,3-м или 4-м,
функция возвращает количество прочитанных байтов или 0 в
ином случае. При ошибке возвращается -1, а переменной
errno присваивается номер ошибки.
КОДЫ ОШИБОК
EPERM Процесс, не имеющий прав суперпользователя, пытался
изменить console_loglevel или очистить кольцевой
буфер сообщений ядра.
EINVAL Неправильные параметры.
ERESTARTSYS
Системный вызов был прерван сигналом, и ничего не
было прочитано. (Может быть замечено только при
трассировке.)
СООТВЕТСТВИЕ СТАНДАРТАМ
Этот системный вызов предназначен только для работы в
Linux.
ЗАМЕЧАНИЯ
С самого начала многим не нравилось то, что вызов ядра и
библиотечная функция, имеющие одинаковые имена, делают
совершенно разное. В libc4 и libc5 номер этого вызова
определялся как SYS_klog. В glibc 2.0 он получил имя
klogctl.