我是一个内核新手,面临一个奇怪的问题。我写了一个概念验证计算器系统调用,虽然它在大多数计算中工作正常,但当SUBTRACTION结果介于-1到-256之间时,它将返回-1。如果有人能够发现可能发生的事情,将不胜感激。以下是系统调用代码。Linux内核系统调用返回-1而不是{-1,-256}
SYSCALL_DEFINE3(calc, int, a, int, b , char, op) {
int res_int;
switch(op) {
case '+': res_int = a + b;
break;
case '-': res_int = a - b;
break;
case '*': res_int = a * b;
break;
case '/': res_int = (a*1000)/b;
break;
}
printk(KERN_INFO "KERNEL CALC RESULT : %d %c %d = %ld",a, op, b, res_int);
return res_int;
}
编辑: 内核版本:Android的Linux内核3.10.xxx。 平台:Nexus7 ARM EABI。 我不明白的是它失败的原因。 errno根本无用,因为它将-res_int设置为errno。另外,我不明白为什么它只有在res_int为{-1,-256}时才会失败。
a = 1200,b = 1300 op =' - '=> res_int = -100是一个示例,其中printk打印-100,但在我的用户空间应用程序中,我收到-1。
它看起来像res_int是{-1,-256}时,errno被设置为-res_int。
[email protected]:/data/local # ./calc
Please enter request in 'num1 oper num2' format:
2.45 - 2.2
returned from syscall with res_int = 250
errno = 22, strerror(errno) = Invalid argument
Calculator result = 0.250000
[email protected]:/data/local # ./calc
Please enter request in 'num1 oper num2' format:
2.2 - 2.45
returned from syscall with res_int = -1
errno = 250, strerror(errno) = Unknown error 250
Calculator result = -0.001000
[email protected]:/data/local #
大多数(所有?)系统调用在失败时返回“-1”,并将实际结果代码存储到“errno”中。也许你的结果也变成了'errno'呢? –
什么是导致错误结果的论据? – Freddie
@Freddie增加了案例。 – stackoverflow