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