Динамическое добавление записей в sysctl

Рассмотрим этот код:

int procmon_state = 0;
static struct ctl_table_header *procmon_table_header;

static ctl_table state_table[] = {
    {
        .procname = "state", .mode = 0666,
        .proc_handler = &proc_dointvec_minmax,
        .data = &procmon_state, .maxlen = sizeof(int),
        .extra1 = "\x00\x00\x00\x00" /*0*/, .extra2 = "\x01\x00\x00\x00" /*1*/
    },
    { 0 }
};

static ctl_table procmon_table[] = {
    {
        .procname = "procmon", .mode = 0555,
        .child = state_table
    },
    { 0 }
};

procmon_table_header = register_sysctl_table(procmon_table);

Это создаст запись в /proc/sys (так что я мог бы просто sysctl procmon.state=1).

Мой вопрос: как только эта запись будет создана, как я могу добавить больше записей?

РЕДАКТИРОВАТЬ: больше записей внутри procmon, то есть. Например, procmon.another_state


person alexandernst    schedule 23.11.2013    source источник
comment
Может быть, register_sysctl_paths поможет здесь?   -  person Ilya Matveychikov    schedule 23.11.2013
comment
Я бы посмотрел на proc_create_data().   -  person Christophe Vu-Brugier    schedule 24.11.2013
comment
Действительно, register_sysctl_paths может помочь. Я посмотрю на это, спасибо! С другой стороны, proc_create_data он слишком свежий (только 3.10+), даже если бы я не хотел его использовать.   -  person alexandernst    schedule 24.11.2013
comment
Приведенный выше исходный код должен быть добавлен в файл sysctl.h, верно?   -  person Sowndarya K    schedule 03.06.2016
comment
@SowndaryaK это часть кода вашего модуля ядра   -  person alexandernst    schedule 03.06.2016
comment
Пожалуйста, дайте мне знать, где именно я должен добавить (имя модуля)?   -  person Sowndarya K    schedule 06.06.2016


Ответы (2)


В sysctl.h.

Вы должны перечислить все записи, которые могут вам понадобиться перед вызовом register_sysctl_table.

Если вам действительно нужно впоследствии изменить таблицу, вы должны вызвать unregister_sysctl_table перед внесением изменений, а затем снова зарегистрировать ее.

person CL.    schedule 25.11.2013

Да, вы можете, просто загляните в каталог драйверов ядра Linux, чтобы найти множество примеров. По сути, вам просто нужно вызвать register_sysctl_table() несколько раз, так как для каждого вашего вызова вы будете создавать ветку из существующей ветки.

Подробности описаны здесь:

https://tthtlc.wordpress.com/2016/05/26/how-to-add-new-entries-to-sysctl-with-the-same-root/

person Peter Teoh    schedule 26.05.2016