C- printk和pr_info之间的差异



printkpr_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()的危险

相关内容

  • 没有找到相关文章

最新更新