_SYSCALL

Section: Linux Programmer's Manual (2)
Updated: 2020-06-09
Index JM Home Page
 

名前

_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/ に書かれている。

関連キーワード

info   syscall   マクロ   sysinfo   エラーコード   total   free   unistd   プロトタイプ   返り値   struct   loads   個数   提供   アーキテクチャー   kernel   printf   code   shared   Memory   buffers   Number   processes   uptime   ライブラリ

Linux マニュアル 一覧

関連するコマンド・関数

restart_syscall.2   info.1   info.5   sysinfo.2   malloc_info.3   gdbinit.5
 

Index

名前
書式
説明
ファイル
準拠
注意
例
出力例
関連項目
この文書について

This document was created by man2html, using the manual pages.
Time: 04:38:57 GMT, October 11, 2026