printf函数介绍:
Linux 内核中没有 printf 这个函数,在Linux内核中使用printk来显示要打印的字符串,也可以这样说,printf运行在用户态, printk 运行在内核态。printk用法与printf相似,唯一不同之处是printk 可以根据日志级别对消息进行分类,也就是说printk具有打印级别。printk一共有 8 个消息级
别,这 8 个消息级别定义在文件 include/linux/kern_levels.h 里面,定义如下:
#define KERN_SOH "\001"
#define KERN_EMERG KERN_SOH "0" /* 紧急事件,一般是内核崩溃 */
#define KERN_ALERT KERN_SOH "1" /* 必须立即采取行动 */
#define KERN_CRIT KERN_SOH "2" /* 临界条件,比如严重的软件或硬件错误*/
#define KERN_ERR KERN_SOH "3" /* 错误状态,一般设备驱动程序中使用KERN_ERR 报告硬件错误 */
#define KERN_WARNING KERN_SOH "4" /* 警告信息,不会对系统造成严重影响 */
#define KERN_NOTICE KERN_SOH "5" /* 有必要进行提示的一些信息 */
#define KERN_INFO KERN_SOH "6" /* 提示性的信息 */
#define KERN_DEBUG KERN_SOH "7" /* 调试信息 */
数字越小级别越高,即“0”级别最高,“7”的级别最低。使用方法如下:
printk(KERN_EMERG "this is memrg\n"); //打印级别为“0”
该代码的打印等级设置为“KERN_EMERG”即级别为“0”。当没有设置打印级别时printk函数默认打印级别为“4”
printk( "this is memrg\n"); //默认打印级别为“4”
那么这个打印级别到底是干什么用的呢,其实就是控制printk的内容是否在终端上打印出来,printk函数的打印级别称为日志级别,在终端也有一个控制台级别,当printk的日志级别低于控制台级别时printf的内容则不会被打印到终端上。
控制台级别定义在/proc/sys/kernel/printk中,通cat可以查看文件中有四个数字
lhf@ubuntu:~$ cat /proc/sys/kernel/printk
4 4 1 7
这四个数字与控制台级别的设置相关,
第一个:控制台日志级别,优先级高于该值的消息将在控制台显示
第二个:默认消息日志级别,printk没定义优先级时,打印这个优先级以上的消息
第三个:最小控制台日志级别,控制台日志级别可被设置的最小值(最高优先级)
第四个:默认的控制台日志级别