c - 在 C 中实现 shell 时出错

标签 c linux 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("%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;
    }

最佳答案

args[i++] = strtok(input, " \n");

        while((args[i++] = strtok(NULL, " \n")) != NULL);
        args[i] = NULL;

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

关于c - 在 C 中实现 shell 时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26207615/

相关文章:

c - 为什么在C中,对于无符号数据,右移必须是逻辑的?

database - 小文件海量存储策略

linux - 获取 "source"编辑脚本的位置

linux - 在每行的开头添加带有文件名的字符串

shell - 如何找出哪些 shell 命令在 POSIX 兼容的 Linux 系统中可用,哪些不可用?

C 语言的 CPU 模拟

c - 根据内存位置的特定值定义值

linux - Bash 脚本,组合系统中所有用户的目录大小

linux - 在 Linux 中查找在给定文件之前和之后 30 分钟创建的文件

c - 如何获得3点之间的平均距离