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

_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)