INTRO

Section: Linux Programmer's Manual (2)
Updated: 1996-05-22
Index JM Home Page roff page
 

名前

intro, _syscall - システムコールの説明  

説明

この章は Linux のシステムコールを記述している。 Linux のシステムコールのリストについては syscall(2) を参照のこと。  

直接呼び出す

ほとんどの場合、直接システムコールを呼び出す必要はないが、 場合によっては標準 C ライブラリに適切な関数が実装されていないこともある。 このような場合は、プログラマーは syscall(2) を使って、自分でシステムコールを呼び出さなければならない。 過去には、下記に述べる _syscall マクロを使って システムコールの呼び出すこともできた。  

書式

#include <linux/unistd.h>

A _syscall macro

desired system call  

準備

システムコールに関してそのプロトタイプを知ることが重要で ある。引き数の個数、それらの型、そして返り値の型を知らなければならない。 実際の使用にあたっては、より容易にシステムを呼び出すために次の 6 個の マクロが用意されている。その形式は以下の通りである:

_syscallX(type,name,type1,arg1,type2,arg2,...)
X は 0-5 の値で、システムコールが必要とする引き数の数である。
type はシステムコールの返り値の型である。
name はシステムコールの名前である。
typeN は N 番目の引き数の型である。
argN は N 番目の引き数の名前である。

これらのマクロは、指定した引き数を持つ name という名前の関数を生成する。 一度ソースファイル中でこの _syscall() マクロを呼んでおくと、 name でこのシステムコールを呼ぶことができる。  

ファイル

/usr/include/linux/unistd.h  

準拠

このセクションのシステムコールが準拠する Unix の種別や標準規格を 表すために、以下の略号を使用する。 standards(7) を参照。  

注意

カーネル 2.6.18 あたりから、_syscall マクロ群はユーザ空間に対して 提供されるヘッダファイルから削除された。 代わりに syscall(2) を使用すること。 (いくつかのアーキテクチャ、特に ia64、では、過去に _syscall マクロが提供されたことはない。 このようなアーキテクチャでは、常に syscall(2) は必要であった。)

_syscall() マクロはプロトタイプを「生成しない」。ユーザーは自分で プロトタイプを書かなければならないかもしれない。

C++ ユーザーの場合は特に重要である。

システムコールは正のエラーコードのみまたは負のエラーコードのみを 返すことが定められているわけではない。 そのシステムコールがどのようなエラーコードを返すかについて確認する ためにはそのソースコードを読む必要がある。 たいていの場合、標準のエラーコードの負の値 (例えば -EPERM のような) を返す。 _syscall() マクロは、そのシステムコールの返り値 r が負でない場合、 その値をそのまま返す。負の場合には変数 errno に -r を設定して -1 を返す。 各エラーコードに関しては errno(3) を参照。

(mmap(2) などの) いくつかのシステムコールは 5個より多くの引き数を要求する。 こういったシステムコールはスタックに引き数をプッシュし、 その引き数のかたまりへのポインタを渡して処理される。 システムコールを定義する場合、その引き数の型は値渡し (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);

/* 注意: 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
 

関連項目

syscall(2), errno(3), feature_test_macros(7)


 

Index

名前
説明
直接呼び出す
書式
準備
ファイル
準拠
注意
出力例
関連項目

This document was created by man2html, using the manual pages.
Time: 04:31:46 GMT, November 19, 2007