現在稼働中のカーネルについての名前と情報を得ることができるコマンドです。簡単なコマンドの作成を通じて理解します。0;}getoptはコマンドラインオプションインターフェイスです。variable)を渡すことで-で始めるオプション要素を返してくれます。**argvで分割された各文字列の先頭アドレスにはある文字を取得できます。argv[1]以降でコマンドのオプションが入るイメージです。optargでoptionのvalueを取得できます。このオプションを処理するだけのプログラムをBuildします。option続いて本題です。unameソースコードリーディングGNU実装版のソースコードは以下で取得できます。git://git.sv.gnu.org/coreutils.gitunameコマンドをみていきます。main関数からです。argv[0]をset_program_nameに渡している辺りはこれまでの話から理解できると思います。このset_program_nameでグローバル変数に設定します。unameがシステムの情報を取得するために必要なutsnameライブラリをincludeしています。utsname構造体が定義されています。toprintを返します。後にPRINT_KERNEL_NAMEをセットしているためカーネル名だけが表示されます。OSXならDarwinと表示されることになります。以下の構造体を渡すことで長いオプション名と短いオプション名の対応付けを行います。1であればprint_elementを呼びます。print_element関数内のfputsで標準出力に出力します。#ifdefディレクティブでOSごとに処理を切り替えています。システム全体の統計情報を返します。sysctlbyname()です。exit(3)でプログラムを終了させています。EXIT_FAILUREを渡すことで異なるプラットフォームへの移植性を容易にしているようです。Elmastudio。