驱动编程之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中!
你可以根据适当的需要指定优先级以满足需要.
(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没有.
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没有.
相关阅读 更多 +