printk是内核状态信息打印函数,具有与准c库的printf相似的功能。
printk还有信息打印水平。
函数原型:
intprintk(constchar*fmt,) )。
所需的头文件:
#包含
消息打印级别----消息级别:
#defineKERN_EMERG'0'
#defineKERN_ALERT'1'
#defineKERN_CRIT'2'
#defineKERN_ERR'3'
#define
KERN_WARNING'4'
#defineKERN_NOTICE'5'
#defineKERN_INFO'6'
#defineKERN_DEBUG'7'
不同级别的字符串表示不同,数字越小级别越高。 printk输出与输出的日志级别有关,如果输出日志级别高于控制台级别,则显示在控制台上,否则记录在/var/log/message中。 但是,如果系统同时运行klogd和syslogd,则会将其添加到/var/log/message .中
注意:要正常输出,必须打开klogd和syslogd服务。 您可以在klogd中更改系统消息的输出级别。
为什么在linux0.11上在内核状态下使用printk (函数,在用户状态下使用printf )函数? (1) printk ) )函数直接使用了写入终端的函数tty_write )。 另一方面,调用printf (函数为write )系统调用函数写入标准输出设备。 因此,虽然在用户状态(如进程0 )下无法直接使用printk ) )函数,但由于内核状态下已经是权限级别,因此不需要使用系统调用来更改权限级别,而是直接使用printk ) )
printk是内核输出,在终端中看不到。 请看系统日志。 /var/log/message。 或者使用dmesg命令进行查看
你可能会怎么想,printk () )
它不是为了与用户交互而设计的。 虽然我们在hello-1中将它用于这样的目的! 实际上,它为内核提供日志功能,记录内核信息并发出警告。 因此,每个printk () )
声明具有优先级,例如1和KERN_ALERT。 内核总共定义了8个优先级宏。
所以没有必要使用模糊的数字代码,可以从文件linux/kernel.h中
看这些宏观及其含义。 如果不指定优先级,则使用缺省优先级DEFAULT_MESSAGE_LOGLEVEL。
请阅读这些优先级宏。 头文件还描述了每个优先级的含义。 实际上,
像4一样,用宏而不是数字。 像KERN_WARNING一样使用宏。
如果优先级低于intconsole_loglevel,则信息将直接打印在您的终端上。 如果syslogd和klogd同时运行,则无论它们是否显示在控制台上,信息也会添加到文件/var/log/messages中。 除了将信息添加到日志文件外,printk )还使用高优先级(如KERN_ALERT )将信息输出到控制台。
俊逸的麦粉制作真正实用的模块时,应该使用适合可能遇到的情况的优先顺序。