『Linuxシステムコール基本リファレンス ──OSを知る突破口』p.ⅲより
OSがどのような仕組みで動いているのかを考えるとき、その突破口として、システムコールについて考えてみるのは非常に有意義なことです。たとえば、普段シェル上で何気なく「ls -l」を実行していますが、このコマンドの実行の際にはさまざまなシステムコールが呼び出されています。シェル上では少なくともforkとexecveのシステムコールが呼び出され、lsコマンドが起動されます。lsコマンド側ではgetdentsとstatなどのシステムコールが呼び出され、その結果がwriteシステムコールを通じて画面に表示されます。もし、「ls -l > file」のように標準出力をファイルにリダイレクトした場合は、forkとexecveの間ではdupなどのシステムコールも呼び出されます。
この「ls -l」の例のように、表面上はありふれたコマンドを実行していても、OS内部ではさまざまなシステムコールが呼び出されているという事実を知れば、OSのことをより一層おもしろく感じられるようになるでしょう。
同様のことは、C言語のプログラムについても言えます。普段、当たり前のようにプログラム記述に使用しているfopen()/getchar()/printf()などの関数は、Cライブラリ関数(またはマクロ関数)として定義されているものであり、これらの関数の呼び出しは、システムの中心部分から少し離れた部分の関数呼び出しであると言えます。これを、システムの中心に近いシステムコールレベルで見れば、実はopen/read/writeなどのシステムコールが呼び出されているわけであり、そのことを知ると、OSの知識がさらに深まるでしょう。
このように考えていくと、OSにはどのようなシステムコールがあり、それらはどのようなコマンドまたはCライブラリ関数に利用されているのか、ということに興味が湧いてくるはずです。本書は、そのような興味に応えることを念頭に置いた、Linuxのシステムコールの解説書です。
本書で取り上げたシステムコールにはすべてサンプルプログラムを掲載しており、サンプルプログラムを実際にコンパイルして実行してみることにより、システムコールの動作を確認できます。また、いくつかの基本的なUNIXコマンドについては、その簡易バージョンを作成して、システムコールの理解を深めることができるように工夫してあります。
本書がシステムコールの理解のお役に立てれば幸いです。
2018年1月 山森 丈範