C - 尝试在 linux 中构建一个简单的 shell 并在循环中使用 strtok、realloc 时遇到问题

标签 c linux realloc strtok

尝试在 Linux 中为一项任务构建一个 shell 实现,但遇到了麻烦。循环运行 3/4 次后出现以下错误

* `./1' 中的错误:realloc():下一个大小无效:0x000000000132c150 * 中止(核心转储)

我省略了部分代码,因为它很长,而且我知道它们没有问题。如果您需要其他部分,我也可以添加它们。 提前致谢:)

注意:argc和argv是全局变量

int argc = 0;
char **argv = NULL; 

int main(void)
{   
    while(1)
    {
        catch_signal();
        printDate();
        readCommand();

        if(strcmp(argv[0], "cd") == 0)
        {
            changeDirectory();
        }
        else
        {
            executeCommand();
        }
        //free(argv);
    }   
}

void readCommand()
{
    char *buffer = NULL;
    char *token = " ";
    char *p;

    size_t len = 0;
    int i = 0;

    getline(&buffer, &len, stdin);
    p = strtok(buffer, "\n");
    p = strtok(buffer, token);

    while(p)
    {
        argv = realloc(argv, sizeof(char *) * ++i);

        argv[i - 1] = p;
        p = strtok(NULL, token);
    }
    argc = i;
    argv[argc] = NULL;
    free(p);
}

void executeCommand()
{
    int status;
    pid_t pid;

    if((pid = fork()) < 0)
    {
        printf("Error: forking child process failed.");
    }
    else if(pid == 0)
    {
       if(execvp(argv[0], argv) < 0)
       {
           printf("error");
           exit(1);
       }
    }
    else
    {
       while(wait(&status) != pid);
    }
}

最佳答案

您正在重新分配 argv 数组 1 指针太短。最后的 NULL 空间不足指针。考虑更换 while(p)使用此代码循环:

if (!p) {
    /* deal with empty command line */
}

while (p) {
    argv = realloc(argv, sizeof(char *) * (i + 2));
    argv[i++] = p;
    p = strtok(NULL, token);
}

p应以 NULL 开头如果用户输入了实际命令。但是,如果缓冲区包含一个空字符串或只是一个空白字符串怎么办? strtok将返回 NULL直接在这些情况下。您应该忽略此类命令行。

关于C - 尝试在 linux 中构建一个简单的 shell 并在循环中使用 strtok、realloc 时遇到问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29174370/

相关文章:

c - 连接变量时如何避免 sprintf

javascript - Node/child_process 抛出 E2BIG

c++ - CMake 使用依赖的共享库从 Ubuntu 为 RedHat EL6 构建一个独立的二进制文件

linux - Linux 上的 JxBrowser 抛出 NoSuchMethodException : getWindow

linux - 复用char * 指针需要free 和malloc 吗?

linux - 未找到 UNIX 中的 _recalloc

c - Fscanf 从输入中读取不匹配的格式

c - gets() 在 while 循环中只接受一次输入

复杂的声明表达式问题

C 程序通过多次调用 realloc() 崩溃