Printk - Printk
printk je C funkce z Rozhraní jádra Linuxu který tiskne zprávy do protokolu jádra[1]. Přijímá parametr řetězce s názvem formátovací řetězec, který určuje metodu pro vykreslení libovolného počtu různých parametrů datového typu do řetězce[1]. Řetězec se poté vytiskne do protokolu jádra[1].
Poskytuje printf
-jako abstrakce a její analýza formátovacího řetězce a argumentů se chovají podobně printf
[1]. Funguje jako ladicí nástroj pro programátory jádra, kteří tuto funkci potřebují pro protokolování zpráv z jádra[1].
The printk
funkční prototyp je:
int printk(konst char *fmt, ...);
C standardní knihovna a jeho printf
funkce není v režimu jádra k dispozici, proto je potřeba printk
[2].
Rozdíly od printf
Funkce printk
je založeno na printf
, ale nelze je vždy použít stejným způsobem printf
se používá[1].
Úrovně protokolu
printk
umožňuje volanému určit typ a důležitost odesílané zprávy[1]. Tento specifikátor se nazývá úroveň protokolu[1].
Úroveň protokolu určuje typ zprávy odesílané do protokolu zpráv jádra[1]. Úroveň protokolu je určena předpřipravením (pomocí C) řetězcové doslovné zřetězení ) řetězec popisující úroveň protokolu až do začátku vytvářené zprávy[1]. Například zpráva může být vytvořena na KERN_INFO
pomocí následujícího:[1]
printk(KERN_INFO "Zpráva:% s n", arg);
Řetězec určující úroveň protokolu se skládá z ASCII začátek znaku záhlaví, za nímž následuje číslice popisující úroveň protokolu nebo znak „c“, který označuje, že zpráva je pokračováním předchozí zprávy[1][3]. Následující úrovně protokolu spolu s jejich interpretacemi jsou uvedeny níže[4].
0 | KERN_EMERG | Nouzový stav; systém je pravděpodobně mrtvý |
1 | KERN_ALERT | Problém, který vyžaduje okamžitou pozornost |
2 | KERN_CRIT | Kritický stav |
3 | KERN_ERR | Chyba |
4 | KERN_WARNING | Varování |
5 | KERN_NOTICE | Normální, ale možná pozoruhodný stav |
6 | KERN_INFO | Informační zpráva |
7 | KERN_DEBUG | Debugovací zpráva, obvykle nadbytečná |
Pokud není zadána úroveň protokolu, je výchozí úroveň protokolu KERN_WARNING
[1], pokud v samotném jádře nebylo nastaveno jiné výchozí nastavení[Citace je zapotřebí ].
Úrovně protokolu jsou definovány v <linux/kern_levels.h>
[3]. Které úrovně protokolu se vytisknou, se konfiguruje pomocí sysctl soubor / proc / sys / kernel / printk
[1].
Formáty ukazatele
The % str
specifikátor formátu (používá se pro tisk ukazatelů v printf
) je rozšířen o další režimy formátování, například požadavek na tisk a struct sockaddr *
použitím % pISpc
vytiskne adresu a port IPv4 / v6 ve formátu vhodném pro člověka (např. „1.2.3.4:12345“ nebo „[1: 2: 3: 4: 5: 6: 7: 8]: 12345“)[5].
Žádná podpora s plovoucí desetinnou čárkou
Zatímco printf
podpora výstupu čísel s plovoucí desetinnou čárkou, printk
ne[5], protože linuxové jádro nepoužívá čísla s plovoucí desetinnou čárkou v jádře[6].
Popis
Funkce se pokusí zamknout semafor řízení přístupu k systémové konzole[1][7]. Pokud se to podaří, je výstup protokolován a jsou volány ovladače konzoly[1]. Pokud není možné získat semafor, výstup se umístí do vyrovnávací paměti protokolu a aktuální držitel semaforu konzoly si všimne nového výstupu, když uvolní semafor konzoly, a před uvolněním semaforu odešle výstup s vyrovnávací pamětí do konzoly.[1].
Jedním z efektů tohoto odloženého tisku je ten kód, který volá printk
a pak se může změnit úroveň protokolu, která se má vytisknout. Je to proto, že úroveň protokolu, která se má vytisknout, je zkontrolována, když dojde ke skutečnému tisku[1].
Funkce printk
lze volat odkudkoli v jádře s výjimkou velmi raných fází procesu spouštění jádra, kdy není inicializována systémová konzole[4]. Alternativní funkce early_printk
je implementován na některých architekturách a je používán shodně printk
během raných fází procesu spouštění[4].
Reference
- ^ A b C d E F G h i j k l m n Ó p q r "Protokolování zpráv pomocí printk - dokumentace k linuxovému jádru". www.kernel.org. Citováno 2020-09-09.
- ^ ISO / IEC 9899: 2018. Mezinárodní organizace pro normalizaci. 2018.
- ^ A b "kern_levels.h". GitHub. Citováno 2020-09-09.
- ^ A b C "printk ()". archive.is. 2007-08-30. Citováno 2020-09-09.
- ^ A b "Jak získat správný specifikátor formátu printk - dokumentace k Linuxovému jádru". www.kernel.org. Citováno 2020-09-09.
- ^ "Re: Linuxové jádro a plovoucí desetinná čárka". www.redhat.com. Citováno 2020-09-09.
- ^ "Základy ovladačů - dokumentace k jádru Linuxu". www.kernel.org. Citováno 2020-09-09.