Разница между printk и pr_info

Какая разница между printk и pr_info? И при каких условиях я должен выбирать один за другим?

Ответ 1

Ядро printk.h имеет:

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

Так же, как имя, pr_info - printk с приоритетом KERN_INFO.

Ответ 2

Если вы посмотрите конкретно на pr_info, определение, в свою очередь, будет использовать printk(KERN_INFO... (как упоминается в ответе barcelona_delpy), однако, как представляется, фрагмент источника ответа исключает оболочку формата pr_fmt(fmt) (как упоминается в комментариях к LP).


Разница в том, почему вы можете использовать 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')
    ...
}
...

Смотрите также: