以前は、既存のライブラリを使用せずに 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 を使用する必要があることを理解しており、それで作業を完了できます。しかし、これを行う方法を知りたいという正当な理由があると仮定しましょう:-)。