#c #linux #linux-kernel #kernel
#c #linux #linux-ядро #ядро
Вопрос:
У меня проблема в моем модуле ядра, я пишу модуль, который позволяет потокам из разных процессов обмениваться сообщениями, я генерирую разные CHRDriver для ее достижения. Я написал скелет нужных мне функций, но я заметил, что при одинаковом использовании драйвера file_operations
они также разделяют значения переменных? Как мне сделать, чтобы они имели одинаковые логические переменные, но по разным адресам? Позвольте мне объяснить на примере:
#include "group_message_manager.h"
#include <linux/kernel.h>
int open_value = 0;
int gmm_open(struct inode *inode, struct file *filp){
printk(KERN_ALERT "open value %dn", open_value );
return 0;
}
ssize_t gmm_read(struct file * file, char * buffer, size_t lenght, loff_t * offset){
return 0;
}
ssize_t gmm_write(struct file * file, const char __user * buffer, size_t lenght, loff_t * offset ){
return 0;
}
struct file_operations file_ops_gmm_origin = {
open: gmm_open,
read: gmm_read,
write: gmm_write,
// unlocked_ioctl: mydev_ioctl,
// compat_ioctl: mydev_ioctl,
// release: mydev_release
};
// EXPORT_SYMBOL(file_ops_gmm_origin);
ВЫШЕ .c ФАЙЛ, .h файл СЛЕДУЮЩИЙ
#pragma once
#include <linux/fs.h>
int gmm_open(struct inode *inode, struct file *filp);
ssize_t gmm_read(struct file * file, char * buffer, size_t lenght, loff_t * offset);
ssize_t gmm_write(struct file * file, const char __user * buffer, size_t lenght, loff_t * offset );
extern struct file_operations file_ops_gmm_origin;
Как мне сделать для любого драйвера собственную open_value
переменную, начинающуюся с 0? Потому что в этот момент, если кто-то открывает файл, а затем открывает другой, переменной присваивается значение 2, в то время как я хочу, чтобы двум переменным было присвоено значение 1.
Обновить:
Ваш ответ полезен, но мне нужен механизм, позволяющий при каждом open()
вызове находить одно и то же private_data
, поэтому данные конкретного символьного файла, не относящиеся к одному вызову open()
. Как я могу это сделать? Заранее благодарю
Комментарии:
1. В ядре есть много примеров того, как передать личную дату обратному вызову в файловых операциях.
Ответ №1:
В конце я решил, используя структуру данных хеш-таблицы, где ключ — это идентификатор индекса, а значение — указатель на структуру, содержащую значение, которым мне нужно управлять