A _syscall macro
_syscallX(type,name,type1,arg1,type2,arg2,...)
ここで
これらのマクロは、指定した引数を持つ name という名前の関数を生成する。 一度ソースファイルの中で _syscall() をインクルードしておくと、 そのシステムコールを name という名前で呼ぶことができる。
_syscall() マクロはプロトタイプを「生成しない」。 ユーザーはプロトタイプを自分で書かなければならないかもしれない。 とりわけ C++ ユーザーの場合はそうであろう。
システムコールは、正のエラーコードのみ、または負のエラーコードのみを返すように 定められている訳ではない。そのシステムコールがどのようなエラーコードを返すかを 確認するには、そのソースコードを読む必要がある。たいていの場合は、標準のエラー コードを負にしたものである (例えば -EPERM)。 _syscall() マクロは、そのシステムコールの返り値 r が負でない場合、その値 をそのまま返す。一方、r が負の場合には、変数 errno に -r を設定し、-1 を返す。 エラーコードについては errno(3) を参照。
システムコールを定義する際、引数の型は値渡し (by-value) か、 (構造体のように集合的なデータの場合は) ポインター渡し (by-pointer) でなければならない。
_syscall1(int, sysinfo, struct sysinfo *, info);
int main(void) {
struct sysinfo s_info;
int error;
error = sysinfo(&s_info);
printf("code error = %d\n", error);
printf("Uptime = %lds\nLoad: 1 min %lu / 5 min %lu / 15 min %lu\n"
"RAM: total %lu / free %lu / shared %lu\n"
"Memory in buffers = %lu\nSwap: total %lu / free %lu\n"
"Number of processes = %d\n",
s_info.uptime, s_info.loads[0],
s_info.loads[1], s_info.loads[2],
s_info.totalram, s_info.freeram,
s_info.sharedram, s_info.bufferram,
s_info.totalswap, s_info.freeswap,
s_info.procs);
exit(EXIT_SUCCESS); }
[man1]
[man2]
[man3]
[man4]
[man5]
[man6]
[man7]
[man8]
[a]
[b]
[c]
[d]
[e]
[f]
[g]
[h]
[i]
[j]
[k]
[l]
[m]
[n]
[o]
[p]
[q]
[r]
[s]
[t]
[u]
[v]
[w]
[x]
[y]
[z]