Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C Linux内核函数没有';是否返回正确的值?_C_Linux_Linux Kernel_Kernel_System Calls - Fatal编程技术网

C Linux内核函数没有';是否返回正确的值?

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

我已更改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);
    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;
}