1、printk与printf的区别
内核层使用printk打印,应用层调用C库的printf打印。在内核层是调用不了文件系统中C库的printf只能用printk。两者之间的一个显著区别在于printk允许通过指定一个标志来设置优先级(在include/linux/kern_levels.h中定义),不写则默认为级别4(MESSAGE_LOGLEVEL_DEFAULT),级别高于设定的输出级别才可以显示(可在include/linux/printk.h修改宏CONSOLE_LOGLEVEL_DEFAULT设定输出级别,默认为7):
定义 | 级别 | 含义 |
---|---|---|
KERN_EMERG | 0 | 最高级别,紧急事件 |
KERN_ALERT | 1 | 必须立即处理的信息 |
KERN_CRIT | 2 | 严重的软件或硬件错误 |
KERN_ERR | 3 | 硬件错误 |
KERN_WARNING | 4 | 不影响严重错误的警告 |
KERN_NOTICE | 5 | 需要引起注意的信息 |
KERN_INFO | 6 | 一般信息 |
KERN_DEBUG | 7 | 调试信息 |
在调用过程也是有些差别的,printk函数是直接使用了向终端写函数tty_write(),而printf函数是调用write()系统调用函数向标准输出设备写。
2、设置打印级别 echo 0 > /proc/sys/kernel/printk
可以先查看一下内核信息打印级别 cat /proc/sys/kernel/printk
,得到的数字含义依次为:
- 控制台日志级别:根据上表,优先级高于该级别就会被打印到控制台
- 默认的消息日志级别:没有优先级(上面所说的“不写优先级”)的消息的消息级别
- 最低的控制台日志级别:控制台日志级别可以被设置的最小值(也就是最高的优先级)
- 默认的控制台日志级别:顾名思义,控制台日志级别的缺省值
手动设置输出级别
root@ubuntu:/ # echo 6 4 1 7 > /proc/sys/kernel/printk
或者单个值只设置控制台级别即可:
root@ubuntu:/ # echo 6 > /proc/sys/kernel/printk
这样优先级高于6(数值小的优先级高)对应的消息就会输出到控制台。