printk函数

一个不同是 printk 允许你根据消息的严重程度对其分类, 通过附加不同的记录级别或者 优先级在消息上. 你常常用一个宏定义来指示记录级别. 例如, KERN_INFO, 我们之前曾 在一些打印语句的前面看到过, 是消息记录级别的一种可能值. 记录宏定义扩展成一个字 串, 在编译时与消息文本连接在一起; 这就是为什么下面的在优先级和格式串之间没有逗 号的原因. 这里有 2 个 printk 命令的例子, 一个调试消息, 一个紧急消息:

printk(KERN_DEBUG "Here I am: %s:%i\n", FILE , LINE ); printk(KERN_CRIT "I‘m trashed; giving up on %p\n", ptr);

有 8 种可能的记录字串, 在头文件 <linux/kernel.h> 里定义; 我们按照严重性递减的 顺序列出它们:

KERN_EMERG

用于紧急消息, 常常是那些崩溃前的消息.

KERN_ALERT

需要立刻动作的情形.

KERN_CRIT

严重情况, 常常与严重的硬件或者软件失效有关.

KERN_ERR

用来报告错误情况; 设备驱动常常使用
KERN_ERR 来报告硬件故障.

KERN_WARNING

有问题的情况的警告, 这些情况自己不会引起系统的严重问题.

KERN_NOTICE

正常情况, 但是仍然值得注意. 在这个级别一些安全相关的情况会报告.

KERN_INFO

信息型消息. 在这个级别, 很多驱动在启动时打印它们发现的硬件的信息.

KERN_DEBUG

用作调试消息.

每个字串( 在宏定义扩展里 )代表一个在角括号中的整数. 整数的范围从 0 到 7, 越小 的数表示越大的优先级.

一条没有指定优先级的
printk 语句缺省是 DEFAULT_MESSAGE_LOGLEVEL, 在 kernel/printk.c 里指定作为一个整数. 在 2.6.10 内核中,
DEFAULT_MESSAGE_LOGLEVEL 是 KERN_WARNING, 但是在过去已知是改变的.

基于记录级别,
内核可能打印消息到当前控制台, 可能是一个文本模式终端, 串口, 或者 是一台并口打印机. 如果优先级小于整型值 console_loglevel, 消息被递交给控制台,
一次一行( 除非提供一个新行结尾, 否则什么都不发送 ). 如果 klogd 和 syslogd 都在 系统中运行, 内核消息被追加到
/var/log/messages (或者另外根据你的 syslogd 配置 处理), 独立于 console_loglevel. 如果 klogd 没有运行,
你只有读 /proc/kmsg ( 用 dmsg 命令最易做到 )将消息取到用户空间. 当使用 klogd 时, 你应当记住, 它不会保存 连续的同样的行; 它只保留第一个这样的行,
随后是, 它收到的重复行数.

变量
console_loglevel 初始化成 DEFAULT_CONSOLE_LOGLEVEL, 并且可通过 sys_syslog 系统调用修改. 一种修改它的方法是在调用
klogd 时指定 -c 开关, 在 klogd 的  manpage 里有指定. 注意要改变当前值, 你必须先杀掉 klogd, 接着使用 -c 选项重启它. 另外, 你可写一个程序来改变控制台记录级别. 你会发现这样一个程序的版本在由
O‘ Reilly 提供的 FTP 站点上的 miscprogs/setlevel.c. 新的级别指定未一个整数, 在 1  和 8 之前, 包含 1 和 8. 如果它设为 1, 只有 0 级消息(
KERN_EMERG )到达控制台; 如果它设为 8, 所有消息, 包括调试消息, 都显示.

61

也可以通过文本文件
/proc/sys/kernel/printk 读写控制台记录级别. 这个文件有 4 个 整型值: 当前记录级别, 适用没有明确记录级别的消息的缺省级别, 允许的最小记录级别, 以及启动时缺省记录级别. 写一个单个值到这个文件就改变当前记录级别成这个值; 因此, 例如, 你可以使所有内核消息出现在控制台, 通过简单地输入:

# echo 8 >
/proc/sys/kernel/printk

现在应当清楚了为什么 hello.c 例子使用 KERN_ALERT 标志; 它们是要确保消息会出现 在控制台上.

原文地址:https://www.cnblogs.com/fanweisheng/p/11106341.html

时间: 2024-10-29 15:25:20

printk函数的相关文章

printk 函数消息是如何记录的

printk 函数将消息写入一个   LOG_BUF_LEN 字节长的环形缓存, 长度值从 4 KB 到 1 MB, 由配置内核时选择. 这个函数接着唤醒任何在等待消息的进程, 就是说, 任何在系统 调用中睡眠或者在读取 /proc/kmsg 的进程. 这 2 个日志引擎的接口几乎是等同的, 但 是注意, 从 /proc/kmsg 中读取是从日志缓存中消费数据, 然而 syslog 系统调用能够选 择地在返回日志数据地同时保留它给其他进程. 通常, 读取 /proc 文件容易些并且是 62 kl

printk()函数-消息优先级宏

在对内核进行代码调试的时候,除了打开相应的内核开发配置选项之外,最普通也是最常用的调试就是打印出相关信息进行调试,对某些怀疑的变量进行监视,在用户空间下,我们最常用的方式是通过printf()函数来进行相关信息的输出,而在内核调试中,我们常用printk()函数来进行相关关键信息的输出,与printf()函数不同的地方是,printk()函数有消息输出优先级,即(loglevel),而这些loglevel是用相关的宏进行控制,例如: printk(KERN_DEBUG "I am Senmash

linux中模块的构建,传参,和printk函数的简单使用

静态编译,动态加载应用想访问内核需要通过系统调用 驱动:1.模块(打包,加入内核)2.内核机制3.操作硬件 在Kconfig里面配置menuconfig的时候,不同的类型会在图形化界面的终端显示不用的配置选项:bool CONFIG_HELLO []hello_driver 两态tristate CONFIG_HELLO <>hello_driver 三态的 空 * Mstring/int CONFIG_HELLO ()hello_driver 相当于宏替换 (dest)hello_drive

printk输出(转)

文章转自:http://blog.csdn.net/younger_china/article/details/7082494 1. 控制台的日志优先级 #define KERN_EMERG             "<0>"       /* 致命级:紧急事件消息,系统崩溃之前提示,表示系统不可用   */ #define KERN_ALERT              "<1>"       /* 警戒级:报告消息,表示必须采取措施   

【Linux-驱动】printk的打印级别

级别: 日志级别用宏表示,日志级别宏展开为一个字符串,在编译是由预处理器将它和消息本文拼接成一个字符串,因此printk函数中日志级别宏和格式字符串间不能有逗号.printk的日志级别定义在 /include/linux/kernel.h 中: #define KERN_EMERG "<0>" /* system is unusable */ #define KERN_ALERT "<1>" /* action must be taken i

内核日志及printk结构浅析

作者:tekkamanninja 鸣谢:感谢ChinaUnix技术社区的tekkamanninja提供稿件 ,如需转载,请注明出处. 这段时间复习了一下内核调试系统,注意看了一下printk的实现以及内核日志的相关知识,这里做一下总结.一.printk概述 对于做Linux内核开发的人来说,printk实在是再熟悉不过了.内核启动时显示的各种信息大部分都是通过她来实现的,在做内核驱动调试的时候大部分时候使用她就足矣.她之所以用得如此广泛,一个是由于她使用方便,还有一个重要的原因是她的健壮性.它使

Linux 内核调试之 printk

问题描述:最近这两天再调试 platform 驱动,程序老是有点小问题,得不到自己想要的结果,突然意识到内核调试重要性,重新整理一下 printk 基本用法.内核通过 printk() 输出相关信息,在调用 printk() 函数时必须要指定日志级别. 1.printk 日志等级 在 include/linux/kernel.h 中定义了如下几个日志级别 <span style="font-family:Microsoft YaHei;font-size:12px;">#d

[kernel]内核日志及printk结构分析

一直都知道内核printk分级机制,但是没有去了解过,前段时间和一个同事聊到开机启动打印太多,只需要设置一下等级即可:另外今天看驱动源码,也看到类似于Printk(KERN_ERR "....")的打印信息,以前用都是直接printk("...."),今晚回来就把printk这个机制熟悉一下. 转自:http://blog.csdn.net/tangkegagalikaiwu/article/details/8572365 一.printk概述 对于做Linux内核

printk打印机别

1.查看当前控制台的打印级别 cat /proc/sys/kernel/printk 4    4    1    7 其中第一个"4"表示内核打印函数printk的打印级别,只有级别比他高的信息才能在控制台上打印出来,既 0-3级别的信息 2.修改打印 echo "新的打印级别  4    1    7" >/proc/sys/kernel/printk 3.不够打印级别的信息会被写到日志中可通过dmesg 命令来查看 4.printk的打印级别 #defi