printk
関数とpr_info
関数の正確な違いは何ですか?そして、どのような条件下で、私はどちらを選ぶべきですか?
カーネルのprintk.h には以下が含まれます。
#define pr_info(fmt,arg...) \
printk(KERN_INFO fmt,##arg)
名前と同じように、pr_infoはKERN_INFO優先順位を持つprintkです。
特に_pr_info
_を見ると、定義は次のように_printk(KERN_INFO ...
_を使用します(barcelona_delpyの answer で説明されています)。ただし、回答のソーススニペットは、フォーマットラッパーpr_fmt(fmt)
を除外しているように見えます(LP comment で言及)。
_pr_info
_ではなく_printk(KERN_INFO ...
_を使用する理由との違いは、設定できるカスタム形式です。モジュール内のメッセージの前にprintk
を付ける場合、メソッドは各行に明示的にプレフィックスを追加することです:
_printk(KERN_INFO "mymodule: hello there\n");
// outputs "mymodule: hello there"
_
または:
_printk(KERN_INFO KBUILD_MODNAME " hello there\n");
// 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 there\n");
// outputs "mymodule: hello there" (assuming module is named 'mymodule')
...
}
...
_
以下も参照してください。