INTRO(2)

名前
intro - システムコール序論

説明
この章は Linux のシステムコールを記述しています。

  直接呼出す
ほとんどの場合ダイレクトにシステムコールを呼ぶ必要はないが、 場合によっては標準の C ライブラリにあなたにとって 好都合な関数が実装されていないときがある。

  書式
#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 番目の引数の名前である。

このマクロは、指定された引数と 名前 で呼ばれる一つの関数を生成 する。一旦、ソースファイルにこの _syscall() マクロがインク ルードされると 名前 によってこのシステムコールを呼ぶことができる。

例

#include <stdio.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 = %ds\nLoad: 1 min %d / 5 min %d / 15 min %d\n"
                "RAM: total %d / free %d / shared %d\n"
                "Memory in buffers = %d\nSwap: total %d / free %d\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);
	return(0);
}

出力例
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() マクロはプロトタイプを 生成しない。ユーザーは自分で プロトタイプを作成しなければならない。 C++ ユーザーの場合は 得に重要である。

システムコールは、正のエラーコードであれ負のエラーコードで あれ、返すことを義務づけられているわけではない。 だから、当該のシステムコールがエラーを返すかどうかに関しては そのソースを読む必要がある。 通常、標準のエラーコード、 例えば -EPERM に関しては負のエラーコードである。 _syscall() マクロは、当該のシステムコールの戻り値 r が非負であるとき、 その値を返すが、負のときは大域変数 errno に -r をセットして -1 を返す。

幾つかのシステムコール、例えば mmap, のようなシステムコール は5個以上の引数を要求する。こういったシステムコールは、 スタックに引数をプッシュし、その引数ブロックへのポインタを 渡して処理される。

あるシステムコールを定義する際、その引数タイプは値渡しであ るか、あるいはポインタ渡し（構造体のような集合的なデータの 場合）でなければならない。

準拠
このセクションでは、以下のような幾つかの記号を様々な Unix のタイプを指示 するために使用する。

SVr4
    "Programmer's Reference Manual: Operating System API (Intel processors)" (Prentice-Hall1992, ISBN 0-13-951294-2) によって記 述されている System V Release 4 Unix 。

SVID
    "The System V Interface Definition, Fourth Edition" によって記 述されている System V Interface Definition 。また、このド キュメントは ftp://ftp.fpk.novell.com/pub/unix-standards/svid から ポストスクリプト・ファイルで入手することができる。

POSIX.1
    IEEE 1003.1-1990 part 1。また、これは ISO/IEC 9945-1:1990sとしても知られているし、Donald Lewineの "POSIX Programmer's Guide" (O'Reilly & Associates,Inc., 1991, ISBN 0-937175-73-0)によって記述されている "IEEE Portable Operating System Interface for Computing Environments" としても知られている。

POSIX.1b
    移植可能なオペレーティングシステムのためのリアルタイム機構を 記述した IEEE Std 1003.1b-1993 (POSIX.1b standard)。また、 これは ISO/IEC 9945-1:1996 としても知られているし、 Bill O. Gallmeisterの "Programming for the real world - POSIX.4" (O'Reilly & Associates, Inc. ISBN1-56592-074-0) でも記述されている。

4.3BSD/4.4BSD
    バークレーの4.3と4.4ディストリビューション。4.4BSD は4.3と上位互換である。

V7  ベル研究所に由来する本家 Unixである Version 7。

ファイル
/usr/include/linux/unistd.h

著者
著作者と権利条件に関してはマニュアルページの最初を見ること。 但し、ページによって異なっている可能性がある。ご注意 を。