Была задача вести отдельный лог-файл для определенного драйвера. По умолчанию сообщения от него писались в системный лог с помощь функции 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 *f;
struct inode *inode;
char buffer[255];
int length_write;
mm_segment_t orig_fs;
f = filp_open(filename,O_CREAT|O_RDWR, S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH);
if (f && f->f_op && f->f_op->read && f->f_op->write) {
snprintf(buffer, 255, data);
orig_fs = get_fs();
set_fs(KERNEL_DS);
inode = f->f_dentry->d_inode;
f->f_pos += inode->i_size;
length_write = f->f_op->write(f, buffer, strlen(buffer), &f->f_pos);
fput(f);
set_fs(orig_fs);
}
}
static int _mod_init(void)
{
printk(KERN_INFO "init:\n");
write_file("/tmp/test", "Bla-bla-bla.\n");
return 0;
}
static void _mod_exit(void)
{
printk(KERN_ALERT "exit\n");
}
module_init(_mod_init);
module_exit(_mod_exit);