printk 函数消息是如何记录的

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

62

klogd 的缺省做法. dmesg 命令可用来查看缓存的内容, 不会冲掉它; 实际上, 这个命令 将缓存区的整个内容返回给 stdout, 不管它是否已经被读过.

在停止 klogd 后, 如果你偶尔手工读取内核消息, 你会发现 /proc 看起来象一个 FIFO, 读者阻塞在里面, 等待更多数据. 显然, 你无法以这种方式读消息, 如果 klogd 或者其 他进程已经在读同样的数据, 因为你要竞争它.

如果环形缓存填满, printk 绕回并在缓存的开头增加新数据, 覆盖掉最老的数据. 因此, 这个记录过程会丢失最老的数据.
这个问题相比于使用这样一个环形缓存的优点是可以忽 略的. 例如,
环形缓存允许系统即便没有一个日志进程也可运行, 在没有人读它的时候可 以通过覆盖旧数据浪费最少的内存. Linux 对于消息的解决方法的另一个特性是, printk 可以从任何地方调用, 甚至从一个中断处理里面, 没有限制能打印多少数据. 唯一的缺点 是可能丢失一些数据.

如果 klogd 进程在运行, 它获取内核消息并分发给 syslogd, syslogd 接着检查

/etc/syslog.conf
来找出如何处理它们. syslogd 根据一个设施和一个优先级来区分消 息; 这个设施和优先级的允许值在 <sys/syslog.h> 中定义. 内核消息由
LOG_KERN 设施 来记录, 在一个对应于 printk 使用的优先级上(例如, LOG_ERR 用于 KERN_ERR 消息). 如果 klogd 没有运行,
数据保留在环形缓存中直到有人读它或者缓存被覆盖.

如果你要避免你的系统被来自你的驱动的监视消息击垮, 你或者给 klogd 指定一个 -f (文件) 选项来指示它保存消息到一个特定的文件, 或者定制 /etc/syslog.conf 来适应 你的要求. 但是另外一种可能性是采用粗暴的方式: 杀掉 klogd 和详细地打印消息在一 个没有用到的虚拟终端上,[13]13  或者从一个没有用到的 xterm 上发出命令 cat

/proc/kmsg.

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

时间: 2024-08-05 07:01:20

printk 函数消息是如何记录的的相关文章

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

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

17 | 如何正确地显示随机消息? 学习记录

<MySQL实战45讲>17 | 如何正确地显示随机消息? 学习记录http://naotu.baidu.com/file/ee69cc1cd0aefb09e02efbaf9a3b2909?token=ba56dcf185ed4e27 原文地址:https://www.cnblogs.com/jtfr/p/11368240.html

printk函数

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

清除eclipse 里面主函数的加载记录 launch configuration删除

我们eclipse  里面执行的程序,应用 把他记录下来,生成配置文件. 当我们导出行的jar包的时候,需要制定运行的主函数. 会看到很多的历史主程序,带来方便的同时,也产生了影响. 需要清除写记录的地址: ${WORKSPACE}/.metadata/.plugins/org.eclipse.debug.core/.launches

Aerospike C客户端手册———用户定义函数—应用UDF到记录

应用UDF到记录 Aerospike C客户端API提供aerospike_key_apply()来应用一个用户定义函数到数据库中某记录. 在使用aerospike_key_apply()操作前,包含被应用函数的UDF模块,必须首先注册到Aerospike服务器.请参见[注册用户定义函数]章节来学习如何使用C API注册,或阅读[aql手册]学习如何使用外部工具注册. 下面的代码引用自示例目录[examples/basic_examples/get],由Aerospike C客户端安装包自带.

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

Oracle Length 和 Lengthb 函数说明 .(用来判断记录值里是否有中文内容)

一.官网的说明 http://download.oracle.com/docs/cd/E11882_01/server.112/e26088/functions088.htm#SQLRF00658 Purpose The LENGTH functionsreturn the length of char. LENGTH calculates length usingcharacters as defined by the input character set. --返回以字符为单位的长度. L

Android消息队列图片记录

很早之前为了给学生讲明白整个消息队列是怎么个情况,于是大概阅读了一下消息队列的整个工作过程,鉴于网上大部分都是文字说明,没有一个图例,于是做出了下面这张图,权当作以后复习之用,也供大家学习参考,有什么不整确的请指正. 版权声明:本文为博主原创文章,未经博主允许不得转载.

JavaScript函数原型链知识记录

1 构造函数 构造函数是专门用于创建对象的 function Person(myName, myAge) { // let obj = new Object(); // 系统自动添加的 // let this = obj; // 系统自动添加的 this.name = myName; this.age = myAge; this.say = function () { console.log("hello world"); } // return this; // 系统自动添加的 }