web-dev-qa-db-ja.com

printkとpr_infoの違い

printk関数とpr_info関数の正確な違いは何ですか?そして、どのような条件下で、私はどちらを選ぶべきですか?

19
Jarvis

カーネルのprintk.h には以下が含まれます。

#define pr_info(fmt,arg...) \
    printk(KERN_INFO fmt,##arg)

名前と同じように、pr_infoはKERN_INFO優先順位を持つprintkです。

15
barcelona_delpy

特に_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')
    ...
}
...
_

以下も参照してください。

6
jdknight