加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

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

发布时间:2020-12-13 23:13:47 所属栏目:Linux 来源:网络整理
导读:printk 函数将消息写入一个?? LOG_BUF_LEN 字节长的环形缓存,长度值从 4 KB 到 1 MB,由配置内核时选择. 这个函数接着唤醒任何在等待消息的进程,就是说,任何在系统 调用中睡眠或者在读取 /proc/kmsg 的进程. 这 2 个日志引擎的接口几乎是等同的,但 是注意,从

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.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读