Provided by: manpages-ja-dev_0.5.0.0.20221215+dfsg-1_all 

_SYSCALL(2) Linux Programmer's Manual _SYSCALL(2)
名前
_syscall - ライブラリのサポートなしでシステムコールを起動する (昔の方法)
書式
#include <linux/unistd.h>
A _syscall macro
desired system call
説明
システムコールに関してそのプロトタイプを知ることが重要である。 引数の個数、それらの型、返り値の型を知る必
要がある。 実際の使用にあたっては、システムコールをシステムに呼び出しやすくするために、 7 個のマクロが用
意されている。これらのマクロは以下の形である。
_syscallX(type,name,type1,arg1,type2,arg2,...)
ここで
X は 0〜6 で、システムコールが取る引数の個数である。
type はシステムコールの返り値の型である。
name はシステムコールの名前である。
typeN は N 番目の引数の型である。
argN は N 番目の引数の名前である。
これらのマクロは、指定した引数を持つ name という名前の関数を生成する。 一度ソースファイルの中で
_syscall() をインクルードしておくと、 そのシステムコールを name という名前で呼ぶことができる。
ファイル
/usr/include/linux/unistd.h
準拠
これらのマクロは Linux 固有であり、その使用は非推奨である。
注意
カーネル 2.6.18 あたりから、_syscall マクロ群はユーザー空間に対して提供される ヘッダーファイルから削除さ
れた。代わりに syscall(2) を使用すること。 (いくつかのアーキテクチャー、特に ia64、では、これまで
_syscall マクロが 提供されたことはない。このようなアーキテクチャーでは、常に syscall(2) が必要であっ
た。)
_syscall() マクロはプロトタイプを「生成しない」。 ユーザーはプロトタイプを自分で書かなければならないかも
しれない。 とりわけ C++ ユーザーの場合はそうであろう。
システムコールは、正のエラーコードのみ、または負のエラーコードのみを返すように 定められている訳ではな
い。そのシステムコールがどのようなエラーコードを返すかを 確認するには、そのソースコードを読む必要があ
る。たいていの場合は、標準のエラー コードを負にしたものである (例えば -EPERM)。 _syscall() マクロは、その
システムコールの返り値 r が負でない場合、その値 をそのまま返す。一方、r が負の場合には、変数 errno に -r
を設定し、-1 を返す。 エラーコードについては errno(3) を参照。
システムコールを定義する際、引数の型は値渡し (by-value) か、 (構造体のように集合的なデータの場合は) ポイ
ンター渡し (by-pointer) でなければならない。
例
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <linux/unistd.h> /* for _syscallX macros/related stuff */
#include <linux/kernel.h> /* for struct sysinfo */
_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);
}
出力例
code error = 0
uptime = 502034s
Load: 1 min 13376 / 5 min 5504 / 15 min 1152
RAM: total 15343616 / free 827392 / shared 8237056
Memory in buffers = 5066752
Swap: total 27881472 / free 24698880
Number of processes = 40
関連項目
intro(2), syscall(2), errno(3)
この文書について
この man ページは Linux man-pages プロジェクトのリリース 5.10 の一部である。プロジェクトの説明とバグ報告
に関する情報は https://www.kernel.org/doc/man-pages/ に書かれている。
Linux 2020-06-09 _SYSCALL(2)