printk
和pr_info
功能之间的确切区别是什么?在什么条件下,我应该选择一个吗?
内核的printk.h有:
#define pr_info(fmt,arg...)
printk(KERN_INFO fmt,##arg)
就像名称一样,pr_info()
是printk()
,具有KERN_INFO
优先级。
专门查看pr_info
时,定义将依次使用printk(KERN_INFO ...
(如Barcelona_delpy的答案中所述);但是,答案的源代码片似乎排除了格式包装器pr_fmt(fmt)
(如LPS注释所述)。
差异为什么您可以在printk(KERN_INFO ...
上使用pr_info
是您可以设置的自定义格式。如果您希望使用printk
将消息在模块中前缀,则方法是在每行上明确添加您的前缀:
printk(KERN_INFO "mymodule: hello theren");
// outputs "mymodule: hello there"
或:
printk(KERN_INFO KBUILD_MODNAME " hello theren");
// outputs "mymodule: hello there"
但是,如果您使用pr_info
(和其他pr_*
功能),则可以重新定义格式,只需使用pr_info
而无需其他工作:
... (includes)
#ifdef pr_fmt
#undef pr_fmt
#endif
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
...
{
...
pr_err("hello theren");
// outputs "mymodule: hello there" (assuming module is named 'mymodule')
...
}
...
另请参见:
- kernel.org |打印内核消息
- printk实施
- lwn.net |pr_info()的危险