2017-02-15 30 views
5

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

+0

@CL. Да, мое плохое. – LPs

+0

Все они эквивалентны, кроме отладочной. – 0andriy

ответ

5

kernel's printk.h имеет:

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

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

+0

Фактически '#define pr_info (fmt, ...) eprintf (0, verbose, pr_fmt (fmt), ## __ VA_ARGS __)' – LPs

+0

Исключение - это 'pr_debug()' vs. 'printk (KERN_DEBUG)' и все производные. – 0andriy

0

Если вы посмотрите конкретно на pr_info, определение, в свою очередь, будет использовать printk(KERN_INFO ... (как указано в barcelona_delpy's 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') 
    ... 
} 
... 

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