#linux #c
Проблема заключется в том, что при чтении из файла вылетает сообщение «killed». Есть мысль, что что-то не так с чтением. Но что? А кто его знает... Вот код: #include#include #include #include #include #include #include #include #include #include #include #define TASKLIST "tasklist" #define TASKS "tasks" int open_proc(struct inode *inode, struct file *file); int open_proc_message(void); ssize_t read_proc (struct seq_file *m, void *v); int create_task_entry(void); ssize_t write_proc(struct file *filp, const char *buf, size_t count, loff_t *offp); static struct proc_dir_entry *proc_entry; static struct proc_dir_entry *dir_entry; static char *msg = "hello"; struct file_operations file_fops = { .owner = THIS_MODULE, .open = open_proc, .read = read_proc, .write = write_proc, .release = single_release, }; int create_task_entry(void) { int ret = 0; if(!(dir_entry = proc_mkdir(TASKLIST, NULL))){ printk(KERN_INFO "Can't create the directory %s. Bye\n", TASKLIST); ret = -ENOMEM; } //create file if (!(proc_entry = proc_create(TASKS, 0664, dir_entry, &file_fops))) { remove_proc_entry(TASKLIST, NULL); ret = -ENOMEM; } return ret; } int open_proc(struct inode *inode, struct file *file) { return single_open(file, read_proc, NULL); } ssize_t read_proc (struct seq_file *m, void *v) { if (msg) seq_printf(m,"%s\n", msg); return 0; } int open_proc_message(void) { printk(KERN_ALERT "File was opened!\n\n"); return 0; } int init_module(void) { return create_task_entry(); } void cleanup_module(void){ printk(KERN_INFO "Cleaning Up.\n"); remove_proc_entry(TASKLIST, NULL); remove_proc_entry(TASKS,NULL); } ssize_t write_proc(struct file *filp, const char *buf, size_t count, loff_t *offp){ msg = (char*)kmalloc(255 * sizeof(char), GFP_KERNEL); copy_from_user(msg, buf, count); return count; }
Ответы
Ответ 1
Переделал под запись в /proc. Чтение данного файла с user space корректно. Вот код: #include#include #include #include #include #include #include #include #include int create_proc_entry(void); static int tasks_proc_show(struct seq_file *m, void *v); static int tasks_proc_open(struct inode *inode, struct file *file); static const struct file_operations file_fops = { .open = tasks_proc_open, .read = seq_read, .write = seq_write, .llseek = seq_lseek, .release = single_release, }; static int tasks_proc_show(struct seq_file *m, void *v){ struct task_struct *task = &init_task; while((task = next_task(task))!= &init_task) seq_printf(m,"%s %d\n",task->comm, task->pid); return 0; } static int tasks_proc_open(struct inode *inode, struct file *file){ single_open(file, tasks_proc_show, NULL); } int proc_init(void) { proc_create("ltask",0,NULL,&file_fops); return 0; } void proc_cleanup(void) { remove_proc_entry("ltask",NULL); } MODULE_LICENSE("GPL"); module_init(proc_init); module_exit(proc_cleanup);
Комментариев нет:
Отправить комментарий