2013-04-22 12 views
2

Я создаю модуль ядра linux, и мне было интересно, есть ли способ динамически генерировать файлы proc и использовать их разумным способом.Динамически генерировать файлы proc?

У меня нет проблем с созданием структуры с list_head и оттуда, но моя конечная проблема заключается в том, что я хочу, чтобы одна и та же функция выполнялась с разными переменными. А именно, я просто хочу иметь write_proc, который заканчивает запись в другой буфер в памяти ядра для каждого файла (и read_proc, который читает из того же самого).

Причина, почему я с трудом с этим является то, что функция protoypes для чтения/записи из Proc файлов, кажется, не позволяют это поведение:

int read_proc(char *buf, char **start, off_t offset, int count, 
       int *eof, void *data) { 

int write_proc(struct file *file, const char *buf, 
       unsigned long count, void *data) { 

Теперь я могу статически создать кучу и просто убедитесь, что я выделяю достаточно, но мне интересно, есть ли более элегантное решение.

Вот пример того, как я хотел бы, чтобы она выглядела в пространстве пользователя (у меня нет кода MWE, так как я понятия не имею, где даже начать):

$ echo "file1" > /proc/mydir/create 
$ echo "file2" > /proc/mydir/create 
$ ls /proc/mydir 
    create file1 file2 
$ echo "1" > /proc/mydir/file1 
$ echo "5" > /proc/mydir/file2 
$ cat /proc/mydir/file* 
    1 
    5 

ли я просто ушел выключить глубокий конец?

Я ищу вполне родовую совместимость (2.6.33+)

ответ

1

Моя конечная проблема заключается в том, что я хочу, чтобы одна и та же функция выполнялась с разными переменными.

Я предполагаю, что вы уже можете создать файлы/proc. Как сказал Ilya, create_proc_entry выполняет эту работу (хотя есть и лучшая альтернатива).

Причина, почему я с трудом с этим является то, что функция protoypes для чтения/записи из Proc файлов, кажется, не позволяют это поведение

Ну на самом деле это делает. Если посмотреть на прототип либо функции:

int read_proc(char *buf, char **start, off_t offset, int count, 
       int *eof, void *data); 
         ^^^^^^^^^^ 

int write_proc(struct file *file, const char *buf, 
       unsigned long count, void *data); 
            ^^^^^^^^^^ 

Вы увидите параметр, называемый data, который является общим void *. Используя этот параметр, вы можете заставить одну и ту же функцию работать с разными переменными.

В настоящее время create_proc_entry не самая лучшая функция для этого. Фактически, есть замена для него , что также соответствует лучшей схеме именования для функций/proc. Глядя на the source code itself, вы можете увидеть подпись create_proc_data и как она работает. С помощью этой функции вы можете указать указатель на рабочую область файла/proc. Этот указатель будет передан как вашим функциям чтения, так и записи.

Это очень похоже на то, как работают pthread и многие другие библиотеки, которые выполняют функции указателей как обратные вызовы.


Если я не ошибаюсь, create_proc_entry осуждается.

+0

Я рекомендую посмотреть реализацию/proc через предоставленную мной ссылку. Это очень просто и довольно информативно. На самом деле, это проще читать и использовать, а не пытаться найти информацию из неполной документации или устаревших сообщений в блогах. – Shahbaz

+0

Большое спасибо, извините за задержку в принятии ответа, у меня не было много времени, чтобы поиграть с этим в последнее время. По какой-то причине вещь «данные» полностью сошла с ума, хотя она смотрела мне в лицо! Еще раз спасибо за все детали и ссылки! – zje

0

кажется, что вы ищете create_proc_entry функции. Он может создать запись proc во время выполнения. См., Например, details.

Смежные вопросы