在C中实现shell的错误

时间:2014-10-05 21:54:29

标签: c linux shell

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

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("%s\n", *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;
    }

1 个答案:

答案 0 :(得分: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 ++]时这是一个非法的操作,想知道为什么程序没有被终止。 尝试在预分配或动态缓冲区中解析参数/标记。