NOMBRE
syslog, klogctl − lee o limpia el búfer del anillo de mensajes del núcleo; establece el nivel de registro de la consola
SINOPSIS
/* La interfaz
glibc */
#include <sys/klog.h>
int klogctl(int type, char *bufp, int len);
/* La llamada
al sistema desnuda */
#include <unistd.h>
#include <linux/unistd.h>
_syscall3(int, syslog, int, type, char *, bufp, int, len);
int syslog(int type, char *bufp, int len);
DESCRIPCIÓN
Si necesita la función de libc syslog(), (que se comunica con syslogd(8)), mire en syslog(3). La llamada al sistema de este nombre explica cómo controlar el buffer del núcleo printk() , y la versión de glibc se llama klogctl().
El argumento tipo determina la acción tomada por esta función.
Extraído
(y traducido) de kernel/printk.c:
/*
* Órdenes a sys_syslog:
*
* 0 -- Cierra el registro. Actualmente no hace nada.
* 1 -- Abre el registro. Actualmente no hace nada.
* 2 -- Lee del registro.
* 3 -- Lee hasta los últimos 4kB de mensajes en el
búfer del anillo
* 4 -- Lee y limpia hasta los últimos 4kB de mensajes
en el búfer del anillo
* 5 -- Limpia el búfer del anillo
* 6 -- Desactiva los printk’s a consola
* 7 -- Activa los printk’s a consola
* 8 -- Establece el nivel de mensajes mostrados en la
consola
* 9 -- Devuelve el número de carácters no
leídos en el buffer de registro
*/
Solamente se permite la función 3 para procesos no de root. (La función 9 fue añadida en la versión 2.4.10.)
El
búfer de registro del núcleo
El núcleo tiene un búfer cíclico de
longitud LOG_BUF_LEN (4096, desde la versión 1.3.54:
8192, desde la versión 2.1.113: 16384; en
núcleos recientes el tamaño puede ser
establecido en tiempo de compilación) en el que se
guardan (sin importar su nivel de registro) los mensajes
pasados como argumento a la función del núcleo
printk().
La llamada syslog (2,buf,lon) espera hasta que este búfer de registro del núcleo no esté vacío, y entonces lee como mucho lon bytes en el búffer buf. Devuelve el número de bytes leídos. Los bytes leídos del registro desaparecen del búfer de registro; la información sólo puede leerse una vez. Esta es la función ejecutada por el núcleo cuando un programa de usuario lee /proc/kmsg.
La llamada syslog (3,buf,lon) leerá los últimos lon bytes del búfer de registro (de forma no destructiva), pero no leerá más de lo que se haya escrito en el búfer desde la última orden ’limpiar el búfer del anillo’ (que no limpia el búfer en absoluto). Devuelve el número de bytes leídos.
La llamada syslog (4,buf,lon) hace precisamente lo mismo, pero también ejecuta la orden ’limpiar el búfer del anillo’.
La llamada syslog (5,dummy,idummy) sólo ejecuta la orden ’limpiar el búfer del anillo’.
EL nivel de
registro
La rutina del núcleo printk() solamente
mostrará un mensaje en la consola, si tiene un nivel
de registro menor que el valor de la variable
console_loglevel (inicialmente
DEFAULT_CONSOLE_LOGLEVEL (7), pero puesto a 10 si la
línea de órdenes del núcleo contiene la
palabra ’debug’, y a 15 en caso de un fallo del
núcleo - los 10 y 15 son una tontería, y
equivalen a 8). Esta variable es establecida (a un valor en
el rango de 1 a 8) por la llamada syslog
(8,dummy,value). Las llamadas syslog
(tipo,dummy,idummy) con tipo
igual a 6 ó 7, lo ponen a 1 (sólo
pánicos del núcleo) o a 7 (todos los mensajes
salvo los de depuración), respectivamente.
Cada línea de texto en un mensaje tiene su propio nivel de registro. Este nivel es DEFAULT_MESSAGE_LOGLEVEL - 1 (6) a menos que la línea comience con <d>, donde d es un dígito en el rango de 1 a 7, en cuyo caso el nivel es d. El significado convencional del nivel de registro se define en <linux/kernel.h> así:
#define
KERN_EMERG "<0>" /* el sistema no es
utilizable */
#define KERN_ALERT "<1>" /* debe tomarse una
acción inmediata */
#define KERN_CRIT "<2>" /* condiciones
críticas */
#define KERN_ERR "<3>" /* condiciones de
error */
#define KERN_WARNING "<4>" /* condiciones de
advertencia */
#define KERN_NOTICE "<5>" /*
condición normal pero significativa */
#define KERN_INFO "<6>" /*
información */
#define KERN_DEBUG "<7>" /* mensajes del
nivel de depuración */
VALOR DEVUELTO
En caso de error, se devuelve −1 y se pone un valor en errno. Si no, para tipo igual a 2, 3 ó 4, syslog() devuelve el número de bytes leídos, y de otro modo 0.
ERRORES
EPERM |
Se ha intentado cambiar console_loglevel o limpiar el búfer de anillo de mensajes del núcleo, pero el proceso no tenía permisos de root. | ||
EINVAL |
Malos parámetros. |
ERESTARTSYS
La llamada al sistema ha sido interrumpida por una señal; no se ha leído nada. (Ésto sólo puede ser observado durante una traza.)
CONFORME A
Esta llamada al sistema es específica de Linux y no debería emplearse en programas que se pretendan transportables.
OBSERVACIONES
Desde muy temprano la gente se dio cuenta de que resulta desafortunado que la llamada al núcleo y la rutina de biblioteca del mismo nombre sean completamente diferentes. En libc4 y libc5 el número de esta llamada estaba definido por SYS_klog. En glibc 2.0 la llamada al sistema está bautizada como klogctl.