liunx printk 函数消息是如何记录的

liunx printk 函数消息是如何记录的,第1张

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

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.

总结

以上是内存溢出为你收集整理的liunx printk 函数消息是如何记录的全部内容,希望文章能够帮你解决liunx printk 函数消息是如何记录的所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/1019114.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-23
下一篇2022-05-23

发表评论

登录后才能评论

评论列表(0条)

    保存