名 前
_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);
/* Note: nroff
の ソ ー ス フ ァ
イ ル か ら 直 接
コ ピ ー す る 際
に は 、
printf 文 内 の 余 分 な
バ ッ ク ス ラ ッ
シ ュ を 忘 れ ず
に 削 除 す る よ
う に 。 */
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 プ ロ ジ ェ ク ト の リ リ ー ス 3.79 の 一 部 で あ る 。 プ ロ ジ ェ ク ト の 説 明 と バ グ 報 告 に 関 す る 情 報 は http://www.kernel.org/doc/man−pages/ に 書 か れ て い る 。