Была задача вести отдельный лог-файл для определенного драйвера. По умолчанию сообщения от него писались в системный лог с помощь функции printk, а хотелось чтобы сообщения от этого драйвера сохранялись бы в отдельный файл (/var/log/my_driver.log например). Я написал тестовый модуль, который при загрузке пишет в файл какую-то информацию. Но прочитал на одном англоязычном сайте, что так делать очень очень не рекомендуется. Вопрос: почему? Может кто ответит? Может у кого есть какие-нибудь идеи по этому поводу? Буду очень благодарен Вот код модуля: #include <linux/init.h> #include <linux/module.h> #include <linux/kernel.h> #include <linux/proc_fs.h> #include <linux/sched.h> #include <linux/string.h> #include <linux/signal.h> //#include <linux/signalfd.h> #include <asm/unistd.h> #include <asm/siginfo.h> #include <asm/uaccess.h> #include <linux/syscalls.h> #include <linux/file.h> #include <linux/fs.h> #include <linux/fcntl.h>
MODULE_LICENSE("GPL");
static void write_file(char *filename, char *data) { struct file *file; loff_t pos = 0; int fd; mm_segment_t old_fs = get_fs(); set_fs(KERNEL_DS); fd = sys_open(filename, O_WRONLY|O_CREAT, 0644); if (fd >= 0) { file = fget(fd); if (file) { vfs_write(file, data, strlen(data), &pos); fput(file); } sys_close(fd); } set_fs(old_fs); } //============================================================================= ======================== static int sys_calls_mod_init(void) { printk(KERN_INFO "sys_calls_mod init:\n"); write_file("/tmp/test", "bla-bla-bla\n"); return 0; } //============================================================================= ======================== static void sys_calls_mod_exit(void) { printk(KERN_ALERT "sys_calls_mod exit\n"); } //============================================================================= ======================== module_init(sys_calls_mod_init); module_exit(sys_calls_mod_exit);