UNIXで欠かすことができないプログラムの一つに「シェル」が挙げられるかもしれません。シェルはユーザーのコマンド入力を受け取って指示をOSに伝えたり、結果を画面に表示したり、といった大切や役割を担っているプログラムです。
このシェルを実際にC言語で作成するチュートリアル「Write a Shell in C」が公開されています。シェルのプログラムというと、とても複雑なイメージを持ってしまいますが、このチュートリアルで作成するシェル「lsh」はコメント込みで267行しかない超コンパクトなものです。
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の実行方法
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のシステムプログラミングに興味がある方はチュートリアルにチャレンジしてみてはいかがでしょうか。