2015-03-09 3 views
1

Как я могу получить данные, когда пользователь пишет в proc? (То есть: эхо "Foo">/Proc/MyProc)Как записать в модуль ядра/proc

Я видел чтение из прока (т.е. пользователь делает "кошки/процедурный/MyProc"), как подробно с этого сайта: http://www.linux.com/learn/linux-training/39972-kernel-debugging-with-proc-qsequenceq-files-part-2-of-3

Это кажется работать достаточно хорошо, но я не видел аналогичного метода для написания. Кроме того, я проверил TLDP, но их статья, кажется, выход из даты: http://tldp.org/LDP/lkmpg/2.6/html/x769.html

+0

Я думаю, что сейчас proc уже рассматривается как старый способ. возможно, вас больше интересуют sysfs. – HuStmpHrrr

+1

Посмотрите на LDD3 в теге-вики: http://stackoverflow.com/tags/linux-kernel/info материал действительно покрыт там. – Alex

+0

Я играю для изучения sysfs. Можете ли вы порекомендовать какие-либо хорошие учебники/ссылки, кроме того, что Алекс предоставил? – Maxthecat

ответ

1

На самом деле ядро ​​API для работы с /proc и /sys могут варьироваться в зависимости от версии ядра. Хорошая новость заключается в том, что само ядро ​​самоочевидно. Значит, вы можете легко найти пример кода, который просто исследует источники. Просто посмотрите на какой-то файл в /proc, который поддерживает операции записи:

$ ls -l /proc | grep w 

Например sysrq-trigger делает:

--w------- 1 root root 0 Mar 12 00:41 sysrq-trigger 

Затем найдите соответствующую строку в исходном коде ядра:

$ find . -name '*.[ch]' -exec grep -Hn '"sysrq-trigger"' {} \; 

, который дает вам :

drivers/tty/sysrq.c:1105: if (!proc_create("sysrq-trigger", S_IWUSR, NULL, 

Теперь посмотрим на код в найденном файле (смотрите here для версии 3.18):

static ssize_t write_sysrq_trigger(struct file *file, const char __user *buf, 
            size_t count, loff_t *ppos) 
{ 
     if (count) { 
       char c; 

       if (get_user(c, buf)) 
         return -EFAULT; 
       __handle_sysrq(c, false); 
     } 

     return count; 
} 

static const struct file_operations proc_sysrq_trigger_operations = { 
     .write   = write_sysrq_trigger, 
     .llseek   = noop_llseek, 
}; 

static void sysrq_init_procfs(void) 
{ 
     if (!proc_create("sysrq-trigger", S_IWUSR, NULL, 
         &proc_sysrq_trigger_operations)) 
       pr_err("Failed to register proc interface\n"); 
} 

То же самое вы можете сделать для некоторого sysfs файла. Для более быстрого поиска используйте код индексатора (например, cscope для vim или встроенный индексный код в Eclipse).

+0

Что ?! Прочтите источники ?! Что это за ерунда ?! :) Отличная идея – Maxthecat