+Una volta che si sia certi che non si intende registrare più nessun messaggio
+si può chiudere esplicitamente la connessione al \textit{syslog} con la
+funzione \funcd{closelog}, il cui prototipo è:
+\begin{prototype}{syslog.h}{void closelog(void)}
+
+Chiude la connessione al \textit{syslog}.
+
+\bodydesc{La funzione non restituisce nulla.}
+\end{prototype}
+\noindent l'uso di questa funzione è comunque completamente opzionale.
+
+Come si evince anche dalla presenza della facility \const{LOG\_KERN} in
+tab.~\ref{tab:sess_syslog_facility}, uno dei possibili utenti del servizio del
+\textit{syslog} è anche il kernel, che a sua volta può avere necessità di
+inviare messaggi verso l'\textit{user space}. I messaggi del kernel sono
+mantenuti in un apposito buffer circolare e generati all'interno del kernel
+tramite la funzione \func{printk}, analoga alla \func{printf} usata in
+\textit{user space}.\footnote{una trattazione eccellente dell'argomento si
+ trova nel quarto capitolo di \cite{LinDevDri}.}
+
+Come per i messaggi ordinari anche i messaggi del kernel hanno una priorità ma
+in questo caso non si può contare sulla coincidenza con le costanti di
+tab.~\ref{tab:sess_syslog_priority} dato che il codice del kernel viene
+mantenuto in maniera indipendente dalle librerie. Per questo motivo le varie
+priorità usate dal kernel sono associate ad un valore numerico che viene
+tradotto in una stringa preposta ad ogni messaggio, secondo i valori che si
+sono riportati in fig.~\ref{fig:printk_priority}
+
+\begin{figure}[!htb]
+ \footnotesize \centering
+ \begin{minipage}[c]{15cm}
+ \includestruct{listati/printk_prio.c}
+ \end{minipage}
+ \normalsize
+ \caption{Definizione delle stringhe coi relativi valori numerici che
+ indicano le priorità dei messaggi del kernel (ripresa da
+ \texttt{linux/kernel.h}).}
+ \label{fig:printk_priority}
+\end{figure}
+
+Dato che i messaggi generati da \func{printk} hanno un loro specifico formato
+tradizionalmente si usava un demone ausiliario, \cmd{klogd}, per leggerli,
+rimappare le priorità sui valori di tab.~\ref{tab:sess_syslog_priority} e
+inviarli al sistema del \textit{syslog} nella facility \const{LOG\_KERN}.
+Oggi i nuovi demoni più avanzati che realizzano il servizio (come
+\texttt{rsyslog} o \texttt{syslog-ng}) sono in grado di fare tutto questo da
+soli.
+
+Ma i messaggi del kernel non sono necessariamente connessi al sistema del
+\textit{syslog}; ad esempio possono anche essere letti direttamente dal buffer
+circolare con il comando \texttt{dmesg}. Inoltre è previsto che essi vengano
+stampati direttamente sul terminale indicato come \textit{console} di
+sistema,\footnote{quello che viene indicato con il parametro di avvio
+ \texttt{console} del kernel, si consulti al riguardo sez.~5.3.1 di
+ \cite{AGL}.} se superano una certa priorità, in modo che sia possibile
+vederli anche in caso di blocco totale del sistema (nell'assunzione che la
+console sia collegata).
+
+In particolare la stampa dei messaggi sulla console è controllata dal
+contenuto del file \procfile{/proc/sys/kernel/printk} (o con l'equivalente
+parametro di \func{sysctl}) che prevede quattro valori numerici interi: il
+primo (\textit{console\_loglevel}) indica la priorità corrente oltre la quale
+vengono stampati i messaggi sulla console, il secondo
+(\textit{default\_message\_loglevel}) la priorità di default assegnata ai
+messaggi che non ne hanno impostata una, il terzo
+(\textit{minimum\_console\_level}) il valore minimo che si può assegnare al
+primo valore,\footnote{quello che può essere usato con una delle operazioni di
+ gestione che vedremo a breve per ``\textsl{silenziare}'' il kernel. } ed il
+quarto (\textit{default\_console\_loglevel}) il valore di
+default.\footnote{anch'esso viene usato nelle operazioni di controllo per
+ tornare ad un valore predefinito.}
+
+Per la lettura dei messaggi del kernel e la gestione del relativo buffer
+circolare esiste una apposita \textit{system call} chiamata anch'essa
+\texttt{syslog}, ma dato il conflitto di nomi questa viene rimappata su
+un'altra funzione di libreria, in particolare nelle \acr{glibc} essa viene
+invocata tramite la funzione \funcd{klogctl},\footnote{nelle \acr{libc4} e
+ nelle \acr{libc5} la funzione invece era \func{SYS\_klog}.} il cui prototipo
+è:
+\begin{prototype}{sys/klog.h}{int klogctl(int op, char *buffer, int len)}
+
+Gestisce i messaggi di log del kernel.
+
+\bodydesc{La funzione restituisce in caso di successo un intero positivo o
+ nullo dipendente dall'operazione scelta e $-1$ in caso di errore, nel qual
+ caso \var{errno} assumerà i valori:
+ \begin{errlist}
+ \item[\errcode{EINVAL}] l'argomento \param{op} non ha un valore valido, o si
+ sono specificati valori non validi per gli altri argomenti quando questi
+ sono richiesti.
+ \item[\errcode{ERESTARTSYS}] l'operazione è stata interrotta da un segnale.
+ \item[\errcode{EPERM}] non si hanno i privilegi richiesti per l'operazione
+ richiesta.
+ \item[\errcode{ENOSYS}] il supporto per \func{printk} non è stato compilato
+ nel kernel.
+ \end{errlist}
+ ed inoltre \errval{EBADF} ed \errval{ENOSYS}.
+}
+\end{prototype}