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

static ssize_t pids_store(struct kobject *kobj, struct kobj_attribute *attr, const char *buf, size_t count) {

int num_count = 0;
int i = 0;
int result = 0;
int cur_pid = 0;
char *dst;
char *ddst;

printk(KERN_INFO "GPIO_DEGUG: enter");

dst = buf;
ddst = buf;

printk(KERN_INFO "GPIO_DEGUG:  size of buffer %d ",count);


while(ddst < (buf + sizeof(size_t)*count)) {
ddst ++;
if (ddst[0] == ' ') {
   result = kstrtoint(dst,10,&cur_pid);
   dst=ddst+1;

   printk(KERN_INFO "GPIO_DEGUG: kstrtoint suceeded %d ",cur_pid);
   printk(KERN_INFO "GPIO_DEGUG: kstrtoint suceeded res: %d ",result);
   pids[num_count] = cur_pid;
   num_count += 1;
   }
}

for(i=0;i<num_count;i++) {
    printk(KERN_INFO "GPIO_TEST: pid: %d \n", pids[i]);
}
printk(KERN_INFO "GPIO_DEBUG: leaving\n");
return count;
}


当我echo "100 " > /sys/vt/vt7/pids我得到

[ 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


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

最佳答案

函数kstrtoint期望完整的字符串包含单个整数值。唯一的例外是字符串末尾的换行符:


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


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

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

long val = simple_strtol(dst, &ddst, 10);
if(ddst == ddst) {/* Parsing has been failed. */};


尽管此功能被标记为已过时,但内核中仍使用该功能的一些代码。

另一种可能性是使用sscanf。它期望字符串中整数的数目固定,但是这通常是带有属性的情况:不建议使用复杂的属性表示形式:


  sysfs的约定规定,每个属性应包含一个单一的,人类可读的值。如果您要返回的信息很多,则可能需要考虑将其分为多个属性。


Linux Device Drivers 3, chapter 14)。

09-09 20:36