syscalls.h 与unitsd.h
1 unitsd.h :1)定义了系统调用原型:eg read(),write()....
2)定义了系统调用宏 :eg _syscall2( ret-type, func-name, arg1-type, arg1-name, arg2-type, arg2-name )
3) 定义了系统调用号:eg #define __NR_getjiffies 320
2 syscall.h: 1) 定义了间接系统调用函数syscall()原型(可以 用man syscall 查看该函数具体用法)
2) SYS_
符号常量:大部分系统调用都包括了一个 SYS_
符号常量来指定自己到 __NR_
索引的映射。例如,使用 syscall
调用 __NR_getpid
索引:syscall( SYS_getpid )
#include <stdio.h> #include <linux/unistd.h> #include <sys/syscall.h> #define __NR_getjiffies 320 #define __NR_diffjiffies 321 #define __NR_pdiffjiffies 322 _syscall0( long, getjiffies ); _syscall1( long, diffjiffies, long, ujiffies ); _syscall2( long, pdiffjiffies, long, ujiffies, long*, presult ); int main() { long jifs, result; int err; jifs = getjiffies(); printf( "difference is %lx\n", diffjiffies(jifs) ); err = pdiffjiffies( jifs, &result ); if (!err) { printf( "difference is %lx\n", result ); } else { printf( "error\n" ); } return 0; }
注意 __NR
索引在这个应用程序中是必需的,因为 _syscall
宏使用了 func-name
来构造 __NR
索引(getjiffies
-> __NR_getjiffies
)。其结果是您可以使用它们的名字来调用内核函数,就像其他任何系统调用一样。