#c #linux-kernel #kernel-module
#c #linux-ядро #kernel-module
Вопрос:
есть ли какой-либо способ передать массив строк в модуль ядра? Я хотел бы передать это следующим образом:
insmod mod.ko array="string1","string2","string3"
Есть мой код, но он не компилируется:
#include<linux/module.h>
#include<linux/moduleparam.h>
static int number_of_elements = 0;
static char array[5][10];
module_param_array(array,charp,amp;number_of_elements,0644);
static int __init mod_init(void)
{
int i;
for(i=0; i<number_of_elements;i )
{
pr_notice("%sn",array[i]);
}
return 0;
}
static void __exit mod_exit(void)
{
pr_notice("Endn");
}
module_init(mod_init);
module_exit(mod_exit);
MODULE_AUTHOR("...");
MODULE_LICENSE("GPL");
MODULE_VERSION("1.0");
Комментарии:
1. Не уверен, есть ли способ, но, конечно, вы всегда можете сделать
insmod mod.ko array="string1,string2,string3"
и разделить строку в коде вашего модуля2. Вам нужен массив
char *
:static char *array[5];
.3. @Ctx Фактически это то, что происходит в анализаторе параметров массива ядра в любом случае. Он просто разбивает значение параметра на фрагменты, разделенные запятыми. (Это означает, что вы не можете включить запятую в одну из строк, разделенных запятыми, потому что нет механизма «escape».)
Ответ №1:
module_param_array(array,charp,amp;number_of_elements,0644);
ожидается, что array
это будет массив char *
. Вам просто нужно заменить static char array[5][10];
на static char *array[5];
Обычная командная оболочка, такая как /bin/sh, будет обрабатываться "string1","string2","string3"
как отдельный параметр (при условии, что вы не возились с IFS
переменной оболочки). Анализатор параметров модуля ядра увидит его как один параметр: string1,string2,string3
и с помощью запятых разделит его на три строки, заканчивающиеся нулем. Ваше char *array[5]
содержимое будет заполнено указателями на эти строки, заканчивающиеся нулем, и ваше number_of_elements
значение будет равно количеству строк, разделенных запятыми.