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.

externa länkar