brand new note

ジャズ屋が技術の話をするところ

manページの番号が持つ意味

ずーっと疑問だったのがちょっと解決したのでメモ。まずmanページに番号がなぜ必要なのか、加えて番号を使うことでどのようにコマンドを扱うことができるのかについて書いていきます。

manページに番号がある意味

コマンドのマニュアルであるmanページですが、たまに番号つきで説明が出てくるコマンドに遭遇します。これが何なのかまず簡単に言うと、こういった場合「同じコマンドなんだけど複数の意味、使用用途がある」ということを表しています。同音異義語と似ていますね。例としてtimeコマンドを見てみます。

# man 1 time

f:id:frazz:20180408025752p:plain

# man 2 time

f:id:frazz:20180408025917p:plain

timeの一つ目の意味としては「コマンドの時間計測やリソース使用量を表示する」、二つ目の意味としては「秒単位の時間を得る」とあります。このように複数の意味が存在するコマンドは、”man 数字 コマンド” でそれぞれの意味を確認することができます。これだけ知っていればしばらく困らないとは思いますが、ここで注意してほしいのは「コマンドの使い方が複数ある」ではないということです!追って説明します。

manページの番号が持つ意味

えっでもどっちも時間見てるだけじゃんと思った方、ここで上図の「書式」を見比べてみてください。1ではコマンドの文法が書かれているのに対し、2ではC言語らしきものが書かれていることがわかります。

システムコール

そもそもUNIXのコマンドはC言語を基にして作られています。またOSの様々な制御は「ユーザモード」と「カーネルモード」の2つを用いて行われており、ここを命令が行き来することによってプログラムは動作しています。

普段プログラムはユーザモードで動作しているのですが、ハードウェア(CPU)に直接命令を下したい場合はその都度「システムコール」を使ってカーネルモードにアクセスします。

ちょっと説明のために脱線しますが、ここでlsコマンドの内部でどのようなシステムコールが行われているか確認してみます。

f:id:frazz:20180408032307p:plain

なんかexecveとかopenとかmmapとか書いてありますね。これが全部システムコールです。要するにlsコマンドを打つだけで、内部ではこれだけの回数カーネルモードに遷移しているのです。これらが何なのかは細かい説明になるので書きませんが、ここで下のコマンドをちょっと試してみてください。

man 2 execve
man 2 open
man 2 mmap
man 2 mprotect

書式の所がC言語になってmanページが表示されたでしょうか?

つまり、manページの2番はシステムコールの説明をしているのです。通常のコマンドとしてのtimeはその場で時間を測定する効果をもたらしますが、システムコールとしてのtimeは、何かのコマンドを実行した時に「そのコマンドが内部的に何かの時間を計測した上で結果を返す」というような挙動をする時、使われているという事なのです。

manページの書式内のC言語システムコールの実装そのものであり、コマンドはC言語で作られたシステムコールの集合であるということがお分かりになると思います。

番号と意味の対応

マニュアルの番号はセクションと呼ばれます。1、2以外にもありますので記載しておきます。また、OSによってこれらの番号の振り分け方は異なる場合があります。

  • 1:ユーザコマンド

  • 2:システムコール

  • 3:システムコールを除くCライブラリ関数

  • 4:デバイスファイル

  • 5:設定ファイルなどのフォーマットについて

  • 6:ゲームプログラム

  • 7:その他の概要などの説明

  • 8:システム管理コマンド

例えば1のユーザコマンドだったらlsとかcpとかが含まれますし、4のデバイスファイルだったらnullとかzeroとかttyとかが該当します。*1 一つしかコマンドの意味が存在しない場合はそんなに気にしなくても参照できますが、こういうのがあるとだけ分かっておくといくらか読みやすくなると思います。

おわりに

コマンドを覚えて操作できることを目標とする段階ではなかなか理解しにくい面があるかもしれません。linuxの内部的な話をいろんなところで少しずつ読んで理解すると、このあたりの話も納得できるのではないかと思います。

あ、偉そうに書きましたが間違っていましたら御指摘お願いします。僕も勉強中の身ですので。。。