На самом деле ядро 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).
Я думаю, что сейчас proc уже рассматривается как старый способ. возможно, вас больше интересуют sysfs. – HuStmpHrrr
Посмотрите на LDD3 в теге-вики: http://stackoverflow.com/tags/linux-kernel/info материал действительно покрыт там. – Alex
Я играю для изучения sysfs. Можете ли вы порекомендовать какие-либо хорошие учебники/ссылки, кроме того, что Алекс предоставил? – Maxthecat