在C中实现shell时出错



我正试图在c中实现一个基本的shell。但我遇到了一个问题,我打印了char数组的内容,它只打印出我键入的第一个命令。例如,如果我键入"ls-l",它只会打印出"ls"。然而,这让我很困惑,因为当我在运行shell时键入ls-l时,它会执行正确的命令并显示每个文件的权限。现在,当我做"rm-f/path/to/file"时,它不会删除它。同样,如果我做"cd/path",它的行为就像看不到第二个参数(路径)。我搞不清楚发生了什么。有什么见解吗?

while (1) {
            /* Print the command prompt */
            printf("prompt> ");
            fgets(input, 1024, stdin);
            // get first token
            args[i++] = strtok(input, " n");
            while((args[i++] = strtok(NULL, " n")) != NULL);
            args[i] = NULL;
            printf("%sn", *args);

        if(strcmp(*args, "exit") == 0)
            exit(1);
        else{
            int pid = fork();
            if(pid == 0){
                execvp(args[0], args);
    else waitpid(pid, NULL, 0);

        }
        return 0;
    }
args[i++] = strtok(input, " n");
        while((args[i++] = strtok(NULL, " n")) != NULL);
        args[i] = NULL;

args在程序开始时初始化,因为这是shell程序(假设在执行该程序时没有传递任何参数),只有exec被命名,所以argc=1和args[0]="您的exec名称"。在执行程序之前,args和argc存储在堆栈中。所以,当您在执行args[i++]时,这是一个非法操作,不知道为什么程序并没有被终止。尝试分析预分配或动态缓冲区中的参数/令牌。

最新更新