というわけで、シェルを実装しようと思います。
さてどうやって作りましょう。
ざっくりは、こんな感じで作ればいいのかな。
- 入力を受け付ける(“exit”が入力されるまで繰り返し)
- シェルに通常備わっている機構だとか、組み込みコマンドをつくる
- 標準的なコマンドをつくる
- コマンドライン文字列を解析する(構文木を作る?)
- 処理を実行する
なんか気が遠くなりそうですが、できるところから少しずつやっていって最後に合体という方針で行きます。(TODO: 実装しなきゃいけないリストをつくる)
とりあえず、先が見えないので、やりやすいところからなんとなく手をつけてみます。
まずは、”exit”が入力されたら終了するプロンプトから実装。
#include <stdio.h>
#include <string.h>
#define CMDLINE_LENGTH 255
void enter_prompt_mode(){
char buff[CMDLINE_LENGTH] = "";
while(1) {
printf("prompt> ");
fgets(buff, CMDLINE_LENGTH, stdin);
if(strcmp(buff, "exit¥n") == 0){
break;
} else {
continue;
}
}
}
int main(){
enter_prompt_mode();
return 0;
}
こんな感じ? ど素人なのでへぼかったらつっこんでください。
gets関数がダメだって話はなんとなく覚えていたので、fgets関数で文字列を取得してみたら、最後に改行があるためにstrcmpできなくてモヤモヤしました。
RubyやPerlでいうchomp関数みたいのはないのかなぁとmanでchompとかtrimとか、それっぽい名前を調べてみたけどなし。
もしかしてこのレベルの関数も実装しないとだめとか?
楽しいなあ。
とりあえず”exit¥n”とかちょっと恥ずかしい感じにしておいて、時間があるときに実装することにします。
【学んだこと】
・getsはバッファの終わりとか関係なしに書き込むため(by man)使用は禁止らしい
→ ¥0を書きこむってことかな? (TODO: 調べる)
・fgetsで取得した文字列は最後に改行が入る
・文字列がらみの関数はstring.hにいろいろある
・文字列処理が極めてめんどくさい(けど新鮮でおもしろい)
コメント