printk資訊列印到指定檔案 終端 網路
阿新 • • 發佈:2019-01-03
有的時候除錯核心程式,經常要將資訊列印到其他地方如指定檔案或終端還有網路, 網路的話dreanice版主寫過個netconsole我這裡就不說了...
列印到檔案:
列印到終端:
3.
修改一下/etc/syslog.conf 檔案
#kern.* /dev/console
你列印的東西可能是某個級別的資訊。比如說debug,這用printk 可以控制 。
那麼就寫程
kern.debug /var/log/kern_debug.log
-------------------------
printk(KERN_ALERT "Hello, world\n");
對應
/etc/syslog.conf 中的
kern.alert /kernel.txt
實驗成功,修改後要執行
server syslogd restart 重啟日誌服務。
此方法等於用日誌服務幫你做這個事情。該資訊用
dmesg 命令也可以看到。
程式碼在Centos5.3 2.6.18上測試過了
列印到檔案:
-
#include <linux/kernel.h>
-
#include <linux/module.h>
-
#include <linux/init.h>
-
#include <linux/fs.h>
-
#include <linux/string.h>
-
#include <linux/mm.h>
-
#include <linux/syscalls.h>
-
#include <asm/unistd.h>
-
#include <asm/uaccess.h>
-
#define MY_FILE "/root/LogFile"
-
char buf[128];
-
struct file *file = NULL;
-
static int __init init(void)
-
{
-
mm_segment_t old_fs;
-
printk("Hello, I'm the module that intends to write messages to file.\n");
-
if(file == NULL)
-
file = filp_open(MY_FILE, O_RDWR | O_APPEND | O_CREAT, 0644);
-
if (IS_ERR(file)) {
-
printk("error occured while opening file %s, exiting...\n", MY_FILE);
-
return 0;
-
}
-
sprintf(buf,"%s", "The Messages.");
-
old_fs = get_fs();
-
set_fs(KERNEL_DS);
-
file->f_op->write(file, (char *)buf, sizeof(buf), &file->f_pos);
-
set_fs(old_fs);
-
return 0;
-
}
-
static void __exit fini(void)
-
{
-
if(file != NULL)
-
filp_close(file, NULL);
-
}
-
module_init(init);
-
module_exit(fini);
-
MODULE_LICENSE("GPL");
列印到終端:
-
#include <linux/kernel.h>
-
#include <linux/module.h>
-
#include <linux/init.h>
-
#include <linux/sched.h>
-
#include <linux/tty.h>
-
MODULE_LICENSE("GPL");
-
MODULE_AUTHOR("mq110");
-
static void print_string(char *str)
-
{
-
struct tty_struct *my_tty;
-
my_tty = current->signal->tty;
-
if (my_tty != NULL)
-
{
-
my_tty->driver->write(my_tty,str,strlen(str));
-
my_tty->driver->write(my_tty,"\015\013",2);
-
}
-
}
-
static int __init print_string_init(void)
-
{
-
print_string("Hello world!");
-
return 0;
-
}
-
static void __exit print_string_exit(void)
-
{
-
print_string("Goodbye world!");
-
}
-
module_init(print_string_init);
-
module_exit(print_string_exit);
3.
修改一下/etc/syslog.conf 檔案
#kern.* /dev/console
你列印的東西可能是某個級別的資訊。比如說debug,這用printk 可以控制 。
那麼就寫程
kern.debug /var/log/kern_debug.log
-------------------------
printk(KERN_ALERT "Hello, world\n");
對應
/etc/syslog.conf 中的
kern.alert /kernel.txt
實驗成功,修改後要執行
server syslogd restart 重啟日誌服務。
此方法等於用日誌服務幫你做這個事情。該資訊用
dmesg 命令也可以看到。
程式碼在Centos5.3 2.6.18上測試過了