printk()

odpowiednik printf ale działający w trybie jądra, umożliwiający ponadto nadawanie wypisywanym komunikatom priotytet (loglevel). Nie obsługuje liczb zmiennoprzecinkowych.

Przykład:

printk(KERN_DEBUG "Wywolanie printk() w %s:%d\n"__FILE____LINE__);

Dostępne priorytety:

KERN_EMERG      "<0>"   /* awaria systemu                       */
KERN_ALERT      "<1>"   /* konieczna natychmiastowa interwencja */
KERN_CRIT       "<2>"   /* sytuacja krytyczna                   */
KERN_ERR        "<3>"   /* błąd (np. używane przez sterowniki)  */
KERN_WARNING    "<4>"   /* ostrzeżenie                          */
KERN_NOTICE     "<5>"   /* normalna ale istotna sytuacja        */
KERN_INFO       "<6>"   /* informacja                           */
KERN_DEBUG      "<7>"   /* komunikat diagnostyczny              */

Jak widać mniejszej wartości odpowiada wyzszy priorytet.

O ile w systemie działają klogd i syslogd, przy czym ten drugi skonfigurowany jest standardowo komunikaty trafiają do odpowiedniego pliku w /var/log/ (w zależności od priorytetu). Jeżeli wyłączymy klogd komunikaty trafiają do /proc/kmsg. Możemy je odczytać za pomocą polecenia dmesg.

Miejsce docelowe możemy zmienić modyfikując plik /proc/sys/kernel/printk. Znajdują się tam cztery wartości:
console_loglevel - komunikaty o niższym priorytecie (czyli o większej wartości) od tej wartości wypisywane są na bieżącej konsoli
default_message_loglevel - dla komunikatów bez jawnie określnego priorytetu
minimum_console_loglevel - najmniejsza dopuszczalna wartość console_loglevel
default_console_loglevel - domyślna wartość dla console_loglevel, początkowo 4 (KERN_WARNING)

[mt211004@students ~]$ cat /proc/sys/kernel/printk
1 4 1 7

Na konsoli wypiszą się komunikaty o priorytetach od KERN_CRIT do KERN_DEBUG.

O ile mamy uprawnienia możemy zmienić te ustawienia:

echo "6 4 1 7" > /proc/sys/kernel/printk

Podczas procesu startu systemu printk() nie działa. Należy ją zastąpić funkcją early_printk() - o ile jądro zostało skompilowane z opcją CONFIG_EARLY_PRINTK.

Ponieważ wypisywanie dużej ilości komunikatów może przeciążyć system, dobrze jest sprawdzić czy można bezpiecznie wywołać printk().

Dokonuje się tego za pomocą funkcji printk_ratelimit() zwracającej true jeśli wywołanie printk spełnia narzucone ograniczenia na liczbę i częstotliwość komunikatów.

#include <linux/kernel.h>

if (printk_ratelimit()) printk(KERN_DEBUG "komunikat");

Ograniczenia (dostęp przez pliki - wymagane uprawnienia roota): minimalny średni odstęp między komunikatami w sekundach

  /proc/sys/kernel/printk_ratelimit

największa dopuszczalna liczba komunikatów naraz

  /proc/sys/kernel/printk_ratelimit_burst