c - 如何使用我的自定义系统调用及其名称而不是其编号

标签 c linux-kernel

可能,我混淆了一些概念,但我遇到了这个问题:

为了使用我的系统调用,我正在运行以下代码:

#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/

相关文章:

c - 如何打印出通过 GNU 汇编程序中的 .size 指令分配的符号

linux-kernel - Linux 内核驱动程序 : what model for NVRAM access?

linux - 内核调度程序中的 CFS 和 FIFO

linux - 共享库如何被不同的进程共享?

c - 套接字缓冲区中的头部空间

c - scanf() 将换行符留在缓冲区中

c++ - 在 C 中使用 *&*&p 理解复杂的指针和寻址运算符

c++ - 如何将头文件编译成可执行文件?

c++ - Arduino Uno 代码创建不正确的时间值

c - 为什么 file_operations 中的 unlocked_ioctl 返回 long,而 sys/ioctl.h 中的 ioctl() 返回 int?