嗨,我正在尝试使用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)。