0

getCommandAndArgs 関数は新しいものですが、関数内のコードは以前に機能していたコードのコピーアンドペーストです。コマンドライン引数を許可してから、シェルの実行を続行しようとしています。fork プロセスと run プロセスが別の関数にある可能性があることはわかっていますが、この時点でプログラムがクラッシュする理由がわかるまで、これ以上先に進みたくありません。

char *cmd;
char *arguments[255];
char whitechars[] = " \n\t\r";


void getCommandAndArgs(char *tokLine) {
    char *tok;
    int i=0;
    tok = tokLine;
        while(tok != NULL) {
            if(strcmp(tok, "exit")==0) { 
                    printf("Thank you for using myshell!\n");
                        exit(0); 
                }

                if(i==0) { cmd = tok; }

                arguments[i] = tok;
                tok = strtok(NULL, whitechars);
                i++;
        }
        arguments[i]=NULL;
}

int main(int argc, char *argv[]) {
    char *line, *tok;
    int status=0;
    int i;
    pid_t pid;

    if(argc > 1) {
        line = *argv;
        tok = strtok(line, whitechars);
        tok = strtok(NULL, whitechars);

        getCommandAndArgs(tok);

        pid = fork();
                if(pid == 0) {
                        execvp(cmd, arguments);

                        //oh $h!t message
                        fprintf(stderr, "What is this: %s\n", arguments[0]);
                        exit(0);

                }
                else {
                        waitpid(pid, &status, 0);
                        if(status !=0) {
                                fprintf  (stderr, "error: %s exited with status code %d\n", arguments[0], status);
                        }
                }


    }

    while((line = readline("myShell: ")) != NULL) {

        if(strcmp(line, "")==0) { 
                    continue;                
                }

        tok = strtok(line, whitechars);

        getCommandAndArgs(tok);

        pid = fork();
        if(pid == 0) {
            execvp(cmd, arguments);

            //oh $h!t message
            fprintf(stderr, "What is this: %s\n", arguments[0]);
            exit(0);

        }
        else {
            waitpid(pid, &status, 0);
            if(status !=0) {
                fprintf  (stderr, "error: %s exited with status code %d\n", arguments[0], status);
            }
        }

        free(line);
    }
    printf("\nThank you for using myshell!\n");
    return 0;
}
4

2 に答える 2

1

あなたの機能で

void getCommandAndArgs(char *tokLine) {

がある

tok = strtok(tokLine, whitechars);

whileループの前に行方不明

また

tok = tokLine;

関数strtokの外で実行された場合

于 2013-02-11T08:47:18.050 に答える
0

@matthew johnson tokポインターを初期化せずに参照します。Mohamed KALLEL のコードの方が見栄えが良い

于 2013-02-11T09:16:34.543 に答える