printk
printk är en C -funktion från Linux-kärnans gränssnitt som skriver ut meddelanden till kärnloggen. Den accepterar en strängparameter som kallas formatsträngen , som anger en metod för att rendera ett godtyckligt antal olika datatypparametrar till en sträng. Strängen skrivs sedan ut till kärnloggen.
Den tillhandahåller en printf
-liknande abstraktion och dess analys av formatsträngen och argument beter sig på samma sätt som printf
. Det fungerar som ett felsökningsverktyg för kärnprogrammerare som behöver denna funktion för att logga meddelanden från kärnan.
Printk -
funktionens prototyp är:
int printk ( const char * fmt , ...);
C standardbibliotek och dess printf-
funktion är inte tillgängligt i kärnläge, därav behovet av printk
.
Skillnader från printf
Funktionen printk
är baserad på printf
, men kan inte alltid användas på samma sätt som printf
används.
Logga nivåer
printk
tillåter en uppringare att specificera typen och vikten av meddelandet som skickas. Denna specificering kallas loggnivån.
Loggnivån anger typen av meddelande som skickas till kärnans meddelandelogg. Loggnivån specificeras genom att (med användning av C:s sträng bokstavssammansättning ) en sträng som beskriver loggnivån till början av meddelandet som ska produceras. Till exempel kan ett meddelande skapas på KERN_INFO
med följande:
printk ( KERN_INFO "Meddelande: %s \n " , arg );
Strängen som anger loggnivån består av ASCII- starttecknet för rubrik följt av en siffra som beskriver loggnivån eller tecknet 'c' för att indikera att meddelandet är en fortsättning på föregående meddelande. Följande loggnivåer, tillsammans med deras tolkningar, ges nedan.
0 | KERN_EMERG | Ett nödläge; systemet är förmodligen dött |
1 | KERN_ALERT | Ett problem som kräver omedelbar uppmärksamhet |
2 | KERN_CRIT | Ett kritiskt tillstånd |
3 | KERN_ERR | Ett fel |
4 | KERN_VARNING | En varning |
5 | KERN_NOTICE | Ett normalt men kanske anmärkningsvärt tillstånd |
6 | KERN_INFO | Ett informationsmeddelande |
7 | KERN_DEBUG | Ett felsökningsmeddelande, vanligtvis överflödigt |
När en loggnivå inte anges är standardloggnivån KERN_WARNING
, såvida inte en annan standard har ställts in i själva kärnan [ citat behövs ] .
Loggnivåer definieras i <linux/kern_levels.h>
. Vilka loggnivåer som skrivs ut konfigureras med sysctl -filen /proc/sys/kernel/printk
.
Pekarformat
% p
-formatspecifikationen (används för att skriva ut pekare i printf
) utökas för att lägga till ytterligare formateringslägen, till exempel att begära att skriva ut en struct sockaddr *
med %pISpc
skulle skriva ut en IPv4/v6-adress och port i ett mänskligt format ( t.ex. "1.2.3.4:12345" eller "[1:2:3:4:5:6:7:8]:12345").
Inget flyttalsstöd
Även om printf
stöder utmatning av flyttal, gör inte printk
det, eftersom Linux-kärnan inte använder flyttal i kärnan.
Beskrivning
Funktionen försöker låsa semaforen som styr åtkomst till systemkonsolen. Om det lyckas loggas utgången och konsoldrivrutinerna anropas. Om det inte är möjligt att erhålla semaforen placeras utdata i loggbufferten, och den nuvarande innehavaren av konsolseminaforen kommer att märka den nya utdatan när de släpper konsolsemaforen och skickar den buffrade utsignalen till konsolen innan semaforen släpps .
En effekt av denna uppskjutna utskrift är att koden som anropar printk
och sedan ändrar loggnivåerna som ska skrivas ut kan gå sönder. Detta beror på att loggnivån som ska skrivas ut inspekteras när själva utskriften sker.
Funktionen printk
kan anropas från var som helst i kärnan förutom under de mycket tidiga stadierna av kärnans startprocess, när systemkonsolen inte är initierad. Den alternativa funktionen early_printk
är implementerad på vissa arkitekturer och används identiskt med printk
under de tidiga stadierna av uppstartsprocessen.