C 将带有空格字符的字符串参数传递给内核模块
模块名称:params.ko 当我使用默认设置时,我可以在加载驱动程序时看到“这是我的字符字符串” 但是,如果使用命令行传递带空格的字符串,则会显示以下错误: 例1:C 将带有空格字符的字符串参数传递给内核模块,c,linux-device-driver,C,Linux Device Driver,模块名称:params.ko 当我使用默认设置时,我可以在加载驱动程序时看到“这是我的字符字符串” 但是,如果使用命令行传递带空格的字符串,则会显示以下错误: 例1: #insmod./params.ko mystring=“Hello World” insmod:在模块中插入'/params.ko'时出错:-1个未知符号 dmesg显示以下信息: params:未知参数“World” 例2: #insmod./params.ko mystring=“HelloWorld” 如果我使用没有空格
#insmod./params.ko mystring=“Hello World”
insmod:在模块中插入'/params.ko'时出错:-1个未知符号
dmesg显示以下信息:
params:未知参数“World”
例2:
#insmod./params.ko mystring=“HelloWorld”
如果我使用没有空格的“HelloWorld”,那么显示字符串就没有问题
我还尝试使用\或“”来查看是否可以逃离该空间以忽略该空间,但没有成功
想请教任何知道如何将包含空格的字符串传递给内核模块的人吗
谢谢并感谢您的帮助。当您运行
insmod./params.ko mystring=“Hello World”
时,您的引号被shell吃掉,insmod二进制文件的参数为字符串mystring=Hello World
。它按原样将其传递给内核,然后全部传递到内核parse_args
函数(在kernel/params.c
中),该函数依次调用next_arg
将下一个参数拆分为名称和值
它肯定可以处理空格,正如我们在代码中看到的以下注释:
/* You can use " around spaces, but can't escape ". */
/* Hyphens and underscores equivalent in parameter names. */
以及以下条件语句:
static char *next_arg(char *args, char **param, char **val)
{
...
for (i = 0; args[i]; i++) {
if (isspace(args[i]) && !in_quote)
break;
...
}
因此,您需要将引号传递给内核,而不是shell。
现在没有linux复选框来检查内核模块的插入,但我想下面的命令可以工作:
# insmod ./params.ko mystring='"Hello World"'
在这里,shell将使用单引号,
insmod
binary的参数将是mystring=“Hello World”
,因此这些引号将按原样传递给内核,这将使您能够按预期解析值。试试看,应该有用。有趣。我假设“world”被解析为一个参数,因此出现了错误。就生铁而言,你能试试mystring=Hello\World吗?也就是说,省去双引号,跳出空格实际上,我认为这可能是一个普遍的问题。。请查看@Greycon,谢谢您提供更多信息。似乎这是一个目前还没有解决方案的普遍问题。@Greycon我试着按照您的建议使用mystring=Hello\World#insmod:在模块中插入“/params.ko”时出错:-1未知符号
dmesg输出:params:Unknown parameter'World'
OK,我认为这是一个一般性问题。我猜您必须传递一个连字符的字符串,然后在内核驱动程序代码中解析这些字符串。
# insmod ./params.ko mystring='"Hello World"'