intro -
システムコールの説明
マニュアルの 2 章では
Linux
のシステムコールについて説明している。
システムコールは Linux
カーネルへのエントリーポイントである。
通常は、システムコールは直接起動される訳ではなく、
ほとんどのシステムコールには対応する
C
ライブラリのラッパー関数があり、
そのラッパー関数がシステムコールを呼び出すのに必要な処理を実行する。
そのため、システムコールを呼び出すのは通常のライブラリ関数を呼び出すのと
同じように見える。
多くの場合、 C
ライブラリのラッパー関数が行うのは以下のことだけである。
- *
- 引数と一意なシステムコール番号をカーネルが期待するレジスターにコピーする
- *
- カーネルがシステムコールの実際の処理を行う時点でカーネルモードに入る
- *
- カーネルが CPU
をユーザーモードに返した際にシステムコールがエラー番号を返したいれば
errno を設定する
しかし、ラッパー関数がこれ以上のことを行う場合もいくつかある。例えば、カーネルモードに入る前に引数に対する前処理を実行したり、システムコールが返した値に対する後処理を行うなどである。このような場合、セクション
2
のマニュアルページでは、基本的に、C
ライブラリ API
インターフェース
(通常は GNU C
ライブラリのもの)
と生のシステムコールの両方の詳細をできるだけ説明しようとする。ほとんどの場合、メインとなる「説明」では
C
ライブラリのインターフェースに焦点をあてて説明し、システムコールでの差分については「注意」のセクションに説明がある。
Linux
のシステムコールのリストについては
syscalls(2) を参照のこと。
エラーの場合、ほとんどのシステムコールは負のエラー番号を返す
(具体的には
errno(3)
で説明されている定数のいずれかを負にした値を返す)。
C
ライブラリのラッパーは呼び出し元からこうした詳細を隠蔽している。
システムコールが負の値を返した場合、ラッパーは絶対値を
errno
変数にコピーし、ラッパーの返り値として
-1 を返す。
成功時にシステムコールが返す値はシステムコールにより異なる。
多くのシステムコールは成功時に
0 を返すが、 成功時に 0
以外の値を返すシステムコールもある。
詳細は個々のマニュアルページで説明されている。
マニュアルページの「書式」の節に規定されたヘッダーファイルから関数の定義を
得るために、プログラマが機能検査マクロを定義しなければならない場合がある
(機能検査マクロの定義が必要な場合、これらの機能検査マクロの定義は
「どの」ヘッダーファイルのインクルードよりも前で行われなければならない)。
このような場合には、必要なマクロがマニュアルページで説明されている。
機能検査マクロのさらなる情報については、
feature_test_macros(7)
を参照のこと。
この章の関数が準拠する
UNIX
システムや標準を示すのにいくつかの単語や略号が
使用されている。
standards(7) を参照のこと。
ほとんどの場合、直接システムコールを呼び出す必要はないが、
場合によっては標準 C
ライブラリに適切な関数が実装されていないこともある。
このような場合は、プログラマは
syscall(2)
を使って、自分でシステムコールを呼び出さなければならない。
過去には、
_syscall(2)
マクロの一つを使ってシステムコールの呼び出すこともできた。
著者と著作権に関しては各マニュアルページのソースのヘッダーを参照すること。
これらはページごとに異なる可能性があることに注意してほしい。
_syscall(2),
syscall(2),
syscalls(2),
errno(3),
intro(3),
capabilities(7),
credentials(7),
feature_test_macros(7),
mq_overview(7),
path_resolution(7),
pipe(7),
pty(7),
sem_overview(7),
shm_overview(7),
signal(7),
socket(7),
standards(7),
system_data_types(7),
symlink(7),
sysvipc(7),
time(7)
この man ページは Linux
man-pages
プロジェクトのリリース
5.10
の一部である。プロジェクトの説明とバグ報告に関する情報は
https://www.kernel.org/doc/man-pages/
に書かれている。