如何从系统调用号获取Linux系统调用名?

时间:2014-04-23 15:48:47

标签: c linux

我需要将Linux系统调用号翻译成人类可读的名称。在内核2.6.32中,我从/usr/include/asm/unistd_32.h中的__NR_ *宏中提取了名称,这很糟糕但是很有效。现在我需要让它在内核3.2.0上工作,这个文件不再存在。

将Linux系统调用号映射为人类可读名称的最不便宜且最便携的方法是什么?例如。 1->退出,6->关闭等

2 个答案:

答案 0 :(得分:1)

文件<sys/syscall.h>定义了很多SYS_个宏(在我的系统上间接通过bits/syscall.h)。例如:

#define SYS_eventfd __NR_eventfd
#define SYS_eventfd2 __NR_eventfd2
#define SYS_execve __NR_execve
#define SYS_exit __NR_exit
#define SYS_exit_group __NR_exit_group
#define SYS_faccessat __NR_faccessat

这是你在看什么?我不确定这是否是你问题的一部分,但你可以这样做:

switch(code) {
#define syscode_case(x) case x: return #x;
    syscode_case(SYS_eventfd);
    syscode_case(SYS_eventf2);
}

您仍然需要知道可用的宏是什么,但您不需要知道实际值。

编辑:

我的来源是man 2 syscall,其中声明:

#include <sys/syscall.h>`   /* For SYS_xxx definitions

答案 1 :(得分:0)

  1. 您可以在内核源代码目录中执行grep -rA3 'SYSCALL_DEFINE.\?(<syscallname>,' *(用您的实际系统调用替换<syscallname>)。
  2. 你可以man syscalls并从那里开始寻找。
  3. 检查here并耐心等待