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].

0KERN_EMERGNouzový stav; systém je pravděpodobně mrtvý
1KERN_ALERTProblém, který vyžaduje okamžitou pozornost
2KERN_CRITKritický stav
3KERN_ERRChyba
4KERN_WARNINGVarování
5KERN_NOTICENormální, ale možná pozoruhodný stav
6KERN_INFOInformační zpráva
7KERN_DEBUGDebugovací 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

  1. ^ 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.
  2. ^ ISO / IEC 9899: 2018. Mezinárodní organizace pro normalizaci. 2018.
  3. ^ A b "kern_levels.h". GitHub. Citováno 2020-09-09.
  4. ^ A b C "printk ()". archive.is. 2007-08-30. Citováno 2020-09-09.
  5. ^ 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.
  6. ^ "Re: Linuxové jádro a plovoucí desetinná čárka". www.redhat.com. Citováno 2020-09-09.
  7. ^ "Základy ovladačů - dokumentace k jádru Linuxu". www.kernel.org. Citováno 2020-09-09.

externí odkazy