用于c内核模块的sysfs中的kstrtoint

用于c内核模块的sysfs中的kstrtoint,c,kernel-module,C,Kernel Module,嗨,我正在尝试使用一个kobject从sysfs写入一个int数组。所以输入是一个char*和一个size变量。然而,我似乎无法让它发挥作用。我的预期输入是num1 num2 num3 我想这是一个参数错误,任何帮助都很好,谢谢。kstrtoint函数在这里定义: 如果您注意到函数中定义的最后一个*res值就是您希望使用的值。在您的情况下,cur_pid应该是要打印的值,如果打印成功,结果应该始终为零。我建议检查结果以确保转换成功 这应该起作用: int cur_pid, result; cha

嗨,我正在尝试使用一个kobject从sysfs写入一个int数组。所以输入是一个char*和一个size变量。然而,我似乎无法让它发挥作用。我的预期输入是num1 num2 num3


我想这是一个参数错误,任何帮助都很好,谢谢。

kstrtoint函数在这里定义:

如果您注意到函数中定义的最后一个*res值就是您希望使用的值。在您的情况下,cur_pid应该是要打印的值,如果打印成功,结果应该始终为零。我建议检查结果以确保转换成功

这应该起作用:

int cur_pid, result;
char *dst = NULL;

cur_pid = result = 0;
dst = buf;

result = kstrtoint(dst, 10, &cur_pid);
if (result)
     printk(KERN_INFO "GPIO_DEGUG: kstrtoint suceeded res: %d ", cur_pid);
else
     printk(KERN_INFO "ERROR");
函数kstrtoint要求完整字符串包含单个整数值。唯一的例外是字符串末尾的换行符:

字符串必须以null结尾,并且在终止null之前还可以包含一个换行符

如您所见,字符串100不适合该要求:它包含超出的空间

要仅将字符串的一部分解析为整数,可以使用simple_strtol:

虽然此函数被标记为过时函数,但使用它的内核中仍有一些代码

另一种可能性是使用sscanf。它要求字符串中有固定数量的整数,但这是属性的常见情况:不建议使用复杂的属性表示:

sysfs的约定规定每个属性都应该包含一个人类可读的值;如果您有大量的信息要返回,您可能需要考虑将其拆分为多个属性。
.

最初我想将一组ints进程ID传入内核模块,但我同意,每个ID只需一个变量就可以了。谢谢您的帮助!Cheers示例中的检查是部分的,调用者也必须检查溢出,这对于simple_strtox函数族来说是不可能的。可能是缺少溢出检查是不推荐simple_*函数族的原因。但在给定的情况下,并不严格要求检查溢出。可能的设计要求用户输入正确的字符串。若期望值失败,那个么整数值将具有和输入不同的字符串表示形式,更糟糕的是。
[ 2765.712770] GPIO_DEGUG: enter 
[ 2765.724468] GPIO_DEGUG:  size of buffer 5 
[ 2765.735101] GPIO_DEGUG: kstrtoint suceeded 0 
[ 2765.746526] GPIO_DEGUG: kstrtoint suceeded res: -22 
[ 2765.757746] GPIO_DEBUG: leaving 
int cur_pid, result;
char *dst = NULL;

cur_pid = result = 0;
dst = buf;

result = kstrtoint(dst, 10, &cur_pid);
if (result)
     printk(KERN_INFO "GPIO_DEGUG: kstrtoint suceeded res: %d ", cur_pid);
else
     printk(KERN_INFO "ERROR");
long val = simple_strtol(dst, &ddst, 10);
if(ddst == ddst) {/* Parsing has been failed. */};