私はCで簡単なシェルを書くことに取り組んでいます。ユーザーがコマンドを入力すると、それらは2次元配列に格納されます。次に例を示します。
SHELL$ ls ; date ; ls
// This is parsed into the following
char* commands[1000] = {"ls", "date", "ls"};
プログラム全体でその入力に特定の役割がない場合、配列の各要素をシステムに渡すforループがあります。lsとdateに特定の役割がありません。
if (did_not_process == 0)
system(commands[i]);
ここで、system()をexecvp()に変換し、まったく同じ機能を使用したいと思います。これは適切に機能しなかった私のアプローチでした:
if (did_not_process == 0) {
command[0] = commands[i];
command[1] = NULL;
if (fork() == 0) {
execvp(command[0], command);
} else {
wait(NULL); //wait for child to complete?
}
}
唯一の問題は、シェルのさらなる反復(単純なwhileループ)を実行すると、実行が散発的かつ制御不能に出力されることです。問題は私が示したコードのどこかにありますが、どこにあるのかわかりません。
出力例は次のとおりです。
SHELL$ ls;date;ls
file
Mon Jul 16 13:42:13 EDT 2012
file
SHELL$ ls
SHELL$ file
初めて動作し、シェル入力と同じ行にファイルを出力します。