文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>驱动编程之printk

驱动编程之printk

时间:2009-04-06  来源:o_Chapman

ldd 3rd 的hello, world示例.
printk(KERN_ALERT"Hello, world\n");
在terminal与/var/log/messages中都无显示.
在console中可以显示.

printk(KERN_INFO"Hello, world\n");
在terminal看不到,但在/var/log/messages可以看到

==>
查阅资料

1.摘自:http://blog.chinaunix.net/u2/82249/showart_1863710.html 感谢原作者.
关于输出信息
: 为什么在X终端中看不到结果呢?
: 这里有两方面的原因:

(1) 要理解printk()的优先级标志.
看到printk(KERN_INFO "Hello world 1.\n");语句了没? 它可和我们常用的printf()不一样!
       
使用printk()是内核程序区别于其它C程序的一个显著特征——内核并不提供printf()函数。printk()将格式化字符窜拷贝到内核的log buffer, log buffer又由syslog程序读取。
   
看看这个例子: printk("Hello world! A string: %s and an integer: %d\n", a_string, an_integer); 它 是不是和我们用的printf()差不多? 但printk()有显著区别于printf()的特征. 其中之一就是你能对它设定优先级标志(priority flag). syslogd(8)以这个优先级标志来判断将内核信息显示在何处: 是记录在/var/log/messages中, 还是显示到console? 比如:printk(KERN_ERR "this is an error!\n");

好了, 了解了printk()函数, 这下知道为什么看不到显示信息了么?——printk只是内核的一种log机制, 并非用于向用户显示信息 (当然, 显示信息也是它的功能之一).

关于优先级
在内核源码数的/include/linux/kernel.h中,有下列的内容:

#define    KERN_EMERG     "<0>"    /* system is unusable                         */
#define    KERN_ALERT      "<1>"    /* action must be taken immediately  */
#define    KERN_CRIT         "<2>"    /* critical conditions                           */
#define    KERN_ERR          "<3>"    /* error conditions                              */
#define    KERN_WARNING "<4>"    /* warning conditions                         */
#define    KERN_NOTICE     "<5>"    /* normal but significant condition    */
#define    KERN_INFO         "<6>"    /* informational                                  */
#define    KERN_DEBUG      "<7>"    /* debug-level messages                     */

以刚才的printk(KERN_ERR "this is an error!\n");为例,它等效于 printk(<3> "this is an error!\n");但最好不要使用幻数!

: 如果不给printk()传递priority flag, 又会是怎样?
: 如果不设定,则默认为DEFAULT_MESSAGE_LOGLEVEL, 它目前等同于KERN_WARNING. 但它的值也许会变, 所以在调用printk()时, 应该指定优先级标志!
如果优先级小于console_loglevel, 消息就会打印到当前的终端上. 若syslog和klogd同时在运行,消息也会被写入/var/log/messages中!
       
你可以根据适当的需要指定优先级以满足需要.

关于printk的更多信息,参考LKD 2rd第18章

(2) 内核信息是显示到文本模式的控制台的
: 如果设定了比较高的优先级(数值低),还是在屏幕上看不到输出消息,这是为何?
: 推荐使用console, (Alt + Ctrl + F1 ~ F6),而非图形界面中的terminal. 如果使用Xterm终端, 消息只是被记录到/var/log/messages中. 屏幕上看不到输出!

下面试验一下, 把刚才的hello-1.c 的printk()语句改为下列内容:

printk(KERN_DEBUG "Hello world, priority = 7\n");
printk(KERN_INFO "Hello world, priority = 6\n");
printk("Hello world, priority = DEFAULT_MESSAGE_LOGLEVEL\n");
printk(KERN_NOTICE "Hello world, priority = 5\n");
printk(KERN_WARNING "Hello world, priority = 4\n");
printk(KERN_ERR "Hello world, priority = 3\n");
printk(KERN_CRIT "Hello world, priority = 2\n");
printk(KERN_ALERT "Hello world, priority = 1\n");
printk(KERN_EMERG "Hello world, priority = 0\n");

经 过试验,发现0~3这4个优先级能在console中显示, 也就是说, console_loglevel为4. KERN_DEBUG无论是在/var/log/messages中还是在console上都没有显示. 6~4在/var/log/messages中有记录, 但3~0没有.
相关阅读 更多 +
排行榜 更多 +
暗黑封魔录手游

暗黑封魔录手游

角色扮演 下载
战国美人游戏

战国美人游戏

角色扮演 下载
仙境苍穹手游

仙境苍穹手游

角色扮演 下载