在使用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
全部0条评论
快来发表一下你的评论吧 !