シンプルなUNIX ShellをCで実装するチュートリアル「Write a Shell in C」

Command

UNIXで欠かすことができないプログラムの一つに「シェル」が挙げられるかもしれません。シェルはユーザーのコマンド入力を受け取って指示をOSに伝えたり、結果を画面に表示したり、といった大切や役割を担っているプログラムです。

このシェルを実際にC言語で作成するチュートリアル「Write a Shell in C」が公開されています。シェルのプログラムというと、とても複雑なイメージを持ってしまいますが、このチュートリアルで作成するシェル「lsh」はコメント込みで267行しかない超コンパクトなものです。

Main c

bashやzshといった有名シェルはとても複雑な作りとなっていますが、これくらいのサイズなら理解できそうですね。

UNIXの仕組みが分かるかも

チュートリアルは、シェルのライフタイムの説明から始まり、メインループの中で入力行を読み取って解析する方法、さらに外部コマンドや組み込みコマンドを実行する方法へ解説が進んでいきます。

int lsh_launch(char **args)
{
  pid_t pid, wpid;
  int status;

  pid = fork();
  if (pid == 0) {
    // Child process
    if (execvp(args[0], args) == -1) {
      perror("lsh");
    }
    exit(EXIT_FAILURE);
  } else if (pid < 0) {
    // Error forking
    perror("lsh");
  } else {
    // Parent process
    do {
      wpid = waitpid(pid, &status, WUNTRACED);
    } while (!WIFEXITED(status) && !WIFSIGNALED(status));
  }

  return 1;
}

特にexec()やfork()といったシステムコールを使って外部コマンドを呼び出す方法が理解できれば、UNIXのプロセスモデルに関する知識を一層深めることができるでしょう。

おまけ: lshの実行方法

1 main

lshは以下のコマンドでコンパイル/実行できます。Mac OS Xで確認しました。

git clone https://github.com/brenns10/lsh
cd lsh/src
gcc -o main main.c
./main

lshは外部コマンドの起動と、cd / help / exitくらいしか実行できないシンプルなシェルですが、最低限の機能は実装されています。UNIXのシステムプログラミングに興味がある方はチュートリアルにチャレンジしてみてはいかがでしょうか。

スポンサーリンク