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.)
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.
VÉASE TAMBIÉN¶
syslog(3)