过去的情况是,如果您需要在不使用现有库的情况下直接在 linux 中进行系统调用,您可以只包含<linux/unistd.h>
它,它会定义一个类似于此的宏:
#define _syscall3(type,name,type1,arg1,type2,arg2,type3,arg3) \
type name(type1 arg1,type2 arg2,type3 arg3) \
{ \
long __res; \
__asm__ volatile ("int $0x80" \
: "=a" (__res) \
: "0" (__NR_##name),"b" ((long)(arg1)),"c" ((long)(arg2)), \
"d" ((long)(arg3))); \
if (__res>=0) \
return (type) __res; \
errno=-__res; \
return -1; \
}
然后你可以在你的代码中的某个地方:
_syscall3(ssize_t, write, int, fd, const void *, buf, size_t, count);
这将为您定义一个write
正确执行系统调用的函数。
似乎这个系统已经被某些东西取代了(我猜是每个进程都获得的“[vsyscall]”页面)更健壮。
那么程序直接在较新的linux内核上执行系统调用的正确方法是什么(请具体说明)?我意识到我应该使用 libc 并让它为我完成工作。但是让我们假设我有充分的理由想知道如何做到这一点:-)。