C Linux内核函数没有';是否返回正确的值?
我已更改linux内核以添加此函数(在添加新的faild后,称为long类型的my_字段): 在syscalls.h中,我有:C Linux内核函数没有';是否返回正确的值?,c,linux,linux-kernel,kernel,system-calls,C,Linux,Linux Kernel,Kernel,System Calls,我已更改linux内核以添加此函数(在添加新的faild后,称为long类型的my_字段): 在syscalls.h中,我有: asmlinkage long sys_set_weight(long weight); 在C语言中,我写道: int set_weight(int weight) { long r = syscall(334, weight); return r; } int main () { int x = set_weight(-3); co
asmlinkage long sys_set_weight(long weight);
在C语言中,我写道:
int set_weight(int weight) {
long r = syscall(334, weight);
return r;
}
int main () {
int x = set_weight(-3);
cout << "set_weight returns: " << x << endl;
return 0;
}
int-set\u-weight(int-weight){
长r=syscall(334,权重);
返回r;
}
int main(){
int x=设定重量(-3);
cout当您调用syscall
时,您通过..
传递int
,但函数需要长的
我不知道为什么当调用需要一个long
时,你让set\u weight
接受一个int
,但是你没有原型可以在传递它之前将它转换成long
。请注意linux中的long在CD中是int,ABI能保证它们是兼容的类型吗?请注意linux中的long在c中是int,你在64这是不正确的。David的分析是正确的。您需要int set\u weight(long weight)
或syscall(334,(long)weight)
在Linux内核中定义syscall函数的正确方法是使用syscall\u define*
系列中的宏。由于系统调用只有一个参数,因此需要使用syscall\u DEFINE1
。使用此宏的示例:。可以使用pr\u info(“%s(%ld)\n”,“func\uu,weight”);
将某些内容打印到内核日志。
asmlinkage long sys_set_weight(long weight);
int set_weight(int weight) {
long r = syscall(334, weight);
return r;
}
int main () {
int x = set_weight(-3);
cout << "set_weight returns: " << x << endl;
return 0;
}