pr_xx( )封裝
在使用printk的時候需要手動添加輸出等級KERN_INFO、KERN_WARNING等,這樣還是有些麻煩。因此,Linux內核也對printk進行了進一步的封裝。
Linux內核將每一個輸出等級封裝為pr_xx()函數,例如,輸出等級KERN_INFO
封裝為pr_info(),輸出等級KERN_WARNING
封裝為pr_warn()。具體如下:
#define pr_emerg(fmt, ...)
printk(KERN_EMERG pr_fmt(fmt), ##__VA_ARGS__)
#define pr_alert(fmt, ...)
printk(KERN_ALERT pr_fmt(fmt), ##__VA_ARGS__)
#define pr_crit(fmt, ...)
printk(KERN_CRIT pr_fmt(fmt), ##__VA_ARGS__)
#define pr_err(fmt, ...)
printk(KERN_ERR pr_fmt(fmt), ##__VA_ARGS__)
#define pr_warn(fmt, ...)
printk(KERN_WARNING pr_fmt(fmt), ##__VA_ARGS__)
#define pr_notice(fmt, ...)
printk(KERN_NOTICE pr_fmt(fmt), ##__VA_ARGS__)
#define pr_info(fmt, ...)
printk(KERN_INFO pr_fmt(fmt), ##__VA_ARGS__)
#define pr_err(fmt, ...)
printk(KERN_ERR pr_fmt(fmt), ##__VA_ARGS__)
這里對輸出等級為KERN_DEBUG
的封裝是比較特殊的,因為debug等級比較常用,內核對pr_debug()分為了三種情況:
如果設置了 CONFIG_DYNAMIC_DEBUG
,則此pr_debug()擴展為 dynamic_pr_debug(),主要用于 動態輸出 。否則,如果定義了 DEBUG
宏,則它等同于具有 KERN_DEBUG
日志級別的 printk。 如果未定義 DEBUG,則它什么都不做 。
pr_debug()的定義如下:
/* If you are writing a driver, please use dev_dbg instead */
#if defined(CONFIG_DYNAMIC_DEBUG) ||
(defined(CONFIG_DYNAMIC_DEBUG_CORE) && defined(DYNAMIC_DEBUG_MODULE))
#include < linux/dynamic_debug.h >
/**
* pr_debug - Print a debug-level message conditionally
* @fmt: format string
* @...: arguments for the format string
*
* This macro expands to dynamic_pr_debug() if CONFIG_DYNAMIC_DEBUG is
* set. Otherwise, if DEBUG is defined, it's equivalent to a printk with
* KERN_DEBUG loglevel. If DEBUG is not defined it does nothing.
*
* It uses pr_fmt() to generate the format string (dynamic_pr_debug() uses
* pr_fmt() internally).
*/
#define pr_debug(fmt, ...)
dynamic_pr_debug(fmt, ##__VA_ARGS__)
#elif defined(DEBUG)
#define pr_debug(fmt, ...)
printk(KERN_DEBUG pr_fmt(fmt), ##__VA_ARGS__)
#else
#define pr_debug(fmt, ...)
no_printk(KERN_DEBUG pr_fmt(fmt), ##__VA_ARGS__)
#endif
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。
舉報投訴
-
內核
+關注
關注
3文章
1363瀏覽量
40228 -
Linux
+關注
關注
87文章
11230瀏覽量
208934 -
函數
+關注
關注
3文章
4307瀏覽量
62433
發布評論請先 登錄
相關推薦
Linux內核中斷設計與實現
裸機編程中使用中斷比較麻煩,需要配置寄存器、使能IRQ等等。而在Linux驅動編程中,內核提供了完善的終端框架,只需要申請中斷,然后注冊中斷處理函數即可,使用非常方便。
發表于 07-29 08:57
?774次閱讀
Linux內核學習筆記:printk調試
很多內核開發者喜歡的調試工具是printk,在Linux內核中,使用printk()函數來打印信息,它與C庫的printf()函數類似。
發表于 06-01 15:14
?1103次閱讀
Linux內核源代碼
Linux內核源代碼本章講述在L i n u x內核源碼中,應該從何處開始查找特定的內核函數。本書并不要求讀者具有C語言編程能力,也不要求讀
發表于 02-09 15:24
?36次下載
linux內核kernel-api
linux內核kernel-api,不知道從哪兒找的了,但是你如果想要做內核編程,這是一部api函數詳盡的工具書!!!五星推薦
發表于 10-30 17:16
?19次下載
基于Android的Linux內核的電源管理
Early Suspend和Late Resume是Android在標準Linux的基礎上增加的一項特性。當用戶空間的向內核請求進入suspend時,這時候會先進入early suspend狀態,驅動程序可以注冊early suspend的回調
發表于 04-24 13:47
?1063次閱讀
linux內核是什么_linux內核學習路線
Linux內核是一個操作系統(OS)內核,本質上定義為類Unix。它用于不同的操作系統,主要是以不同的Linux發行版的形式。Linux
發表于 09-16 15:49
?2615次閱讀
linux內核中do_initcalls函數的執行邏輯分析
在linux內核啟動過程中,會向終端打印出很多的日志信息,從這些信息中可以得到許多內核的行為。
Linux內核模塊參數傳遞與sysfs文件系統
Linux應用開發中,為使應用程序更加靈活地執行用戶的預期功能,我們有時候會通過命令行傳遞一些參數到main函數中,使得代碼邏輯可以依據參數執行不同的任務。同樣,Linux內核也提供了
發表于 06-07 16:23
?2082次閱讀
評論