2

私は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

初めて動作し、シェル入力と同じ行にファイルを出力します。

4

1 に答える 1

3

一般的な原則として、システムコールの戻り値にエラーがないかどうかを確認する必要があります。

int cpid = fork()
if (cpid == -1) {
    perror("fork");
} else if (cpid == 0) {
    execvp(command[0], command);
    perror("execvp");
    _exit(1);
} else {
    if (waitpid(cpid, 0, 0) < 0)
        perror("waitpid");
}
于 2012-07-16T19:11:41.407 に答える