Printk - Printk

printk a C funktsiyasi Linux yadrosi interfeysi xabarlarni yadro jurnaliga chop etadi[1]. Bu satr parametrini qabul qiladi format mag'lubiyati, bu satrga o'zboshimchalik bilan har xil ma'lumotlar turi parametr (lar) ni ko'rsatish usulini belgilaydi[1]. Keyin mag'lubiyat yadro jurnaliga bosiladi[1].

Bu a printf- abstraktsiya singari va uning format satrini va argumentlarini tahlil qilish shunga o'xshash harakat qiladi printf[1]. U yadrodan xabarlarni yozish uchun ushbu funktsiyaga muhtoj bo'lgan yadro dasturchilari uchun disk raskadrovka vositasi sifatida ishlaydi[1].

The printk funktsiya prototipi:

int printk(konst char *fmt, ...);

C standart kutubxonasi va uning printf funktsiyasi yadro rejimida mavjud emas, shuning uchun kerak printk[2].

Dan farqlari printf

Funktsiya printk ga asoslangan printf, lekin har doim ham xuddi shunday ishlatilishi mumkin emas printf ishlatilgan[1].

Jurnal darajalari

printk qo'ng'iroq qiluvchiga yuborilayotgan xabar turi va ahamiyatini ko'rsatishga imkon beradi[1]. Ushbu spetsifikator jurnal darajasi deb ataladi[1].

Jurnal darajasi yadro xabarlar jurnaliga yuboriladigan xabar turini belgilaydi[1]. Jurnal darajasi oldindan belgilash bilan belgilanadi (C-dan foydalanib) mag'lubiyatli so'z birikmasi ) ishlab chiqariladigan xabarning boshlanishigacha jurnal darajasini tavsiflovchi satr[1]. Masalan, xabarni KERN_INFO quyidagilardan foydalanib:[1]

printk(KERN_INFO "Xabar:% s n", arg);

Jurnal darajasini ko'rsatuvchi satr quyidagilardan iborat ASCII sarlavha belgisining boshlanishi, keyin jurnal darajasini tavsiflovchi raqam yoki xabarni ko'rsatish uchun 'c' belgisi oldingi xabarning davomi[1][3]. Quyidagi jurnal darajalari va ularning sharhlari quyida keltirilgan[4].

0KERN_EMERGFavqulodda holat; tizim ehtimol o'likdir
1KERN_ALERTZudlik bilan e'tiborni talab qiladigan muammo
2KERN_CRITOg'ir holat
3KERN_ERRXato
4KERN_OGOHLANTIRISHOgohlantirish
5KERN_NOTICEOddiy, lekin ehtimol e'tiborga loyiq holat
6KERN_INFOAxborot xabari
7KERN_DEBUGNosozliklarni tuzatish to'g'risidagi xabar, odatda ortiqcha

Agar jurnal darajasi ko'rsatilmagan bo'lsa, standart jurnal darajasi KERN_OGOHLANTIRISH[1], agar yadroning o'zida boshqacha sukut o'rnatilmagan bo'lsa[iqtibos kerak ].

Jurnal darajalari <linux/kern_levels.h>[3]. Qaysi jurnal sathlari bosilgan va yordamida tuzilgan sysctl fayl / proc / sys / kernel / printk[1].

Pointer formatlari

The % p format ko'rsatgichi (ko'rsatgichlarni chop etish uchun ishlatiladi printf) qo'shimcha formatlash rejimlarini qo'shish uchun kengaytirilgan, masalan, a ni bosib chiqarishni so'rash struct sockaddr * foydalanish % pISpc IPv4 / v6 manzili va portini odamlarga qulay shaklda chop etishi mumkin (masalan, "1.2.3.4:12345" yoki "[1: 2: 3: 4: 5: 6: 7: 8]: 12345")[5].

Suzuvchi nuqta yordami yo'q

Esa printf suzuvchi nuqta raqamlarini chiqarishni qo'llab-quvvatlash, printk emas[5], chunki Linux yadrosi yadro ichida suzuvchi nuqta raqamlaridan foydalanmaydi[6].

Tavsif

Funktsiya semafora tizim konsoliga kirishni boshqarish[1][7]. Agar u muvaffaqiyatli bo'lsa, chiqish qayd qilinadi va konsol drayverlari chaqiriladi[1]. Agar semaforni olishning iloji bo'lmasa, chiqishlar log buferiga joylashtiriladi va konsol semaforining amaldagi egasi konsol semaforini chiqarganda yangi chiqishni sezadi va buferlangan chiqishni semaforni chiqarishdan oldin konsolga yuboradi.[1].

Ushbu kechiktirilgan nashrning bir samarasi - bu qo'ng'iroq qiladigan kod printk va keyin chop etiladigan jurnal sathlari buzilishi mumkin. Buning sababi shundaki, bosib chiqariladigan jurnal darajasi haqiqiy bosib chiqarish sodir bo'lganda tekshiriladi[1].

Funktsiya printk tizim yadrosi yuklash jarayonining dastlabki bosqichlaridan tashqari, tizim konsoli ishga tushirilmaguncha, yadroning istalgan joyidan chaqirilishi mumkin.[4]. Muqobil funktsiya erta_printk ba'zi arxitekturalarda amalga oshiriladi va bir xil ishlatiladi printk yuklash jarayonining dastlabki bosqichlarida[4].

Adabiyotlar

  1. ^ a b v d e f g h men j k l m n o p q r "Printk bilan xabarlarni jurnalga yozish - Linux yadrosi hujjatlari". www.kernel.org. Olingan 2020-09-09.
  2. ^ ISO / IEC 9899: 2018. Xalqaro standartlar tashkiloti. 2018 yil.
  3. ^ a b "kern_levels.h". GitHub. Olingan 2020-09-09.
  4. ^ a b v "printk ()". arxiv.is. 2007-08-30. Olingan 2020-09-09.
  5. ^ a b "Qanday qilib printk formatidagi aniqlovchilarni to'g'ri yo'lga qo'yish kerak - Linux yadrosi hujjatlari". www.kernel.org. Olingan 2020-09-09.
  6. ^ "Re: Linux yadrosi va suzuvchi nuqta". www.redhat.com. Olingan 2020-09-09.
  7. ^ "Drayv asoslari - Linux yadrosi hujjatlari". www.kernel.org. Olingan 2020-09-09.

Tashqi havolalar