2

これは、シェル コマンドを実行するために使用しているクリーンなコードです。
は常にisExit0 であり、ループは である限り実行する必要がありますが、実行する引数として!isExitコマンドを使用して 1 つのループの後にプログラムが終了しますls
誰にもアイデアはありますか?出力は OK (ls) ですが、プログラムは終了します。コードはEclipse上でCで書かれています。
Windows 7 上の VM で実行されている Ubuntu 12 で実行されています。

int main() {
    int numberOfCommands, numOfWords, i, isExit = 0, isBackGround = 0, isSucces;
    char input[256];
    char *cmdAndArgs[256];
    char *commands[256];
do{
    // gets and parses user command...
    ExecuteCmd(cmdAndArgs);
    } while (!isExit);
    return EXIT_SUCCESS;
}

void ExecuteCmd(char *cmdAndArgs[]){
    pid_t pid;
    pid = fork();
    if (pid != 0) {
        execvp(cmdAndArgs[0], cmdAndArgs);
        exit(0);
    } else {
        waitpid(pid, &status, 0);
    } 
}
4

2 に答える 2

7

execvpは、子ではなく親プロセスで実行しています。ロジック:

pid_t pid;
pid = fork();
if (pid != 0) {
    execvp(cmdAndArgs[0], cmdAndArgs);
    exit(0);
} else {
    waitpid(pid, &status, 0);
}

次のように逆にする必要があります。

pid_t pid;
pid = fork();
if (pid == 0) { /* Child */
    execvp(cmdAndArgs[0], cmdAndArgs);
    exit(0);
} else if (pid == -1) {
    perror("fork");
} else {
    waitpid(pid, &status, 0);
}

からの戻りコードは次のfork()とおりです。-1==フォークが失敗しました(errno理由を判別するために使用)。0==私は子供です。> 0==私は親です。RETURNVALUEセクションのフォークのリファレンスを参照してください。

于 2012-05-18T12:33:39.003 に答える
0

でバッファ オーバーフローが発生している可能性はあります// gets and parses user command...か? 割り当てられたスペースを超えて書き込むと、の値を上書きしてしまう可能性がありますisExit

于 2012-05-18T12:27:41.433 に答える