printk 函数通常用在 Linux 内核中用于打印信息,可以将打印的信息输出在控制台或者某个文件当中。 与 printf 函数相似。
案例:
printk(KERN_WARNING "Hello kernel!\n");
在内核代码中插入该代码,当内核运行后代码执行至该处时,将会在控制台输出字符 "Hello kernel!" 。
其中 KERN_CONT 是打印优先级。可用的打印优先级有:
#define KERN_EMERG KERN_SOH "0" /* system is unusable */
#define KERN_ALERT KERN_SOH "1" /* action must be taken immediately */
#define KERN_CRIT KERN_SOH "2" /* critical conditions */
#define KERN_ERR KERN_SOH "3" /* error conditions */
#define KERN_WARNING KERN_SOH "4" /* warning conditions */
#define KERN_NOTICE KERN_SOH "5" /* normal but significant condition */
#define KERN_INFO KERN_SOH "6" /* informational */
#define KERN_DEBUG KERN_SOH "7" /* debug-level messages */
#define KERN_CONT KERN_SOH "c"
KERN_SOH 的数字越小,打印优先级越高。
在内核中插入的 printk 是否打印在控制台中,取决于控制台的打印优先级。可以使用以下命令查看当前控制台的打印优先级:
# cat /proc/sys/kernel/printk
7 4 1 7
这四个数字分别代表
- 控制台打印优先级:优先级高于该值的printk打印才会输出到控制台重定向的串口或屏幕上
- 默认的消息打印优先级
- 最低的控制台打印优先级
- 默认的控制台打印优先级
数字越小,优先级越高。
当控制台的打印优先级(7)低于内核中 printk 的消息打印优先级(KERN_WARNING : 4)时,在内核中的 printk 函数输出都会打印在控制台上。
可以通过以下命令修改 printk 的打印等级:
# echo 3 4 1 7 > /proc/sys/kernel/printk
# cat /proc/sys/kernel/printk
3 4 1 7
或者使用 dmesg 命令:
# dmesg -n 3
此时控制台的打印优先级(3)大于内核中 printk 的消息打印优先级(KERN_WARNING : 4),内核中的 printk 函数输出将不会打印在控制台上,而是保存在内核的日志缓存中,可以使用命令 dmesg
查看。