可能,我混淆了一些概念,但我遇到了这个问题:
为了使用我的系统调用,我正在运行以下代码:
#include <stdio.h>
#include <linux/kernel.h>
#include <sys/syscall.h>
#include <unistd.h>
#define __NR_hello 337
long hello_syscall(void) {
return syscall(__NR_hello);
}
int main(int argc, char *argv[]) {
long int a = hello_syscall();
printf(“System call returned %ld\n”, a);
return 0;
}
这样就可以了!但是,如果我想执行如下操作,只使用系统调用名称而不使用数字定义等...怎么办?
#include <stdio.h>
#include <linux/kernel.h>
#include <sys/syscall.h>
#include <unistd.h>
int main(int argc, char *argv[]) {
long int a = hello();
printf(“System call returned %ld\n”, a);
return 0;
}
我必须包含自定义头文件吗?
最佳答案
所有系统调用都按照您的方式调用。
唯一的区别是包装器(如您为自己的系统调用提供的那个 hello_syscall()
)是链接到您的程序的某些库的一部分,默认使用 libc。
为了能够简单地调用 hello()
将 hello_syscall
重命名为 hello
,将它放在一个库中并将该库链接到您的程序.没有自动为你做这件事。
您永远不会直接调用内核。
要了解如何为其他系统调用完成此操作,请查看您最喜欢的 libc 实现的源代码。
更新:
如果可能的话,将额外的系统调用放入模块中。这使您不必首先修补内核以使系统调用可用。
关于c - 如何使用我的自定义系统调用及其名称而不是其编号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23324938/