printk函数

如果你不小心, 你会发现自己用 printk 产生了上千条消息, 压倒了控制台并且, 可能地, 使系统日志文件溢出. 当使用一个慢速控制台设备(例如, 一个串口), 过量的消息速率也 能拖慢系统或者只是使它不反应了. 非常难于着手于系统出错的地方, 当控制台不停地输 出数据. 因此, 你应当非常注意你打印什么, 特别在驱动的产品版本以及特别在初始化完 成后. 通常, 产品代码在正常操作时不应当打印任何东西; 打印的输出应当是指示需要注 意的异常情况.

 

另一方面, 你可能想发出一个日志消息, 如果你驱动的设备停止工作. 但是你应当小心不 要做过了头. 一个面对失败永远继续的傻瓜进程能产生每秒上千次的尝试; 如果你的驱动 每次都打印"my device is broken", 它可能产生大量的输出, 如果控制台设备慢就有可 能霸占 CPU -- 没有中断用来驱动控制台, 就算是一个串口或者一个行打印机.

 

在很多情况下, 最好的做法是设置一个标志说, "我已经抱怨过这个了", 并不打印任何后 来的消息只要这个标志设置着. 然而, 有几个理由偶尔发出一个"设备还是坏的"的提示. 内核已经提供了一个函数帮助这个情况:

 

int printk_ratelimit(void);

 

这个函数应当在你认为打印一个可能会常常重复的消息之前调用. 如果这个函数返回非零 值, 继续打印你的消息, 否则跳过它. 这样, 典型的调用如这样:

 

if (printk_ratelimit())

printk(KERN_NOTICE "The printer is still on fire\n");

 

printk_ratelimit 通过跟踪多少消息发向控制台而工作. 当输出级别超过一个限度, printk_ratelimit 开始返回 0 并使消息被扔掉.

 

printk_ratelimit 的行为可以通过修改 /proc/sys/kern/printk_ratelimit( 在重新使 能消息前等待的秒数 ) 和 /proc/sys/kernel/printk_ratelimit_burst(限速前可接收的 消息数)来定制.

posted @ 2019-07-06 08:38  樊伟胜  阅读(242)  评论(0编辑  收藏  举报