printk
¶概述
本文假定读者已经了解并使用过C/C++中printf()的相关方法,如果对此不太熟悉,可以点击这里了解printf(3)。
C 语言中的 printf 一系列方法用于分别向不同受体根据某种格式,传递消息。
- The functions
printf()andvprintf()write output to stdout, the standard output stream;fprintf()andvfprintf()write output to the given output stream;sprintf(),snprintf(),vsprintf(), andvsnprintf()write to the character string str.
printk 是内核中广为人知的函数之一,它是我们在开发内核工具时用于打印消息的标准工具,通常也是跟踪和调试的最基本方法。printk 的设计和 printf 非常相似,但是两者的功能却是天差地别。
- printk() 具有类似日志级别的概念
- 格式化字符串虽然在很大程度上与 C99 规范兼容,但并不完全遵循此规范,它有一些扩展和一些限制,在如何正确使用 printk 格式说明
- printk() 输出的信息重定向到了内核日志缓冲区中,这是一个通过/dev/kmsg 导出到用户空间的环形缓冲区,可以通过使用
dmesg命令查看。
¶proto
printk() 方法通常使用方式如下:
1 | printk(KERN_INFO "Message: %s\n", arg); |
其中 KERN_INFO 是内核中的日志级别,它被连接到格式化字符串,日志级别并不是一个单独的参数。当前系统可选的日志级别如下:
| Name | String(Value) | Alias function |
|---|---|---|
| KERN_EMERG | “0” | pr_emerg() |
| KERN_ALERT | “1” | pr_alert() |
| KERN_CRIT | “2” | pr_crit() |
| KERN_ERR | “3” | pr_err() |
| KERN_WARNING | “4” | pr_warn() |
| KERN_NOTICE | “5” | pr_notice() |
| KERN_INFO | “6” | pr_info() |
| KERN_DEBUG | “7” | pr_debug() and pr_devel() if DEBUG is defined |
| KERN_DEFAULT | “” | / |
| KERN_CONT | “c” | pr_cont() |
1 | /** |
1 |
¶附录
linux kernel doc v5.15
Linux kernel doc How to get printk format specifiers right
printf(3) — Linux manual page
