execvp导致内存问题

时间:2013-01-20 01:15:55

标签: c linux

在我的C程序中,我使用execvp命令来解析输入并运行它。 我有这个:

char read_str[MAX_ALLOWED_BUFFER];
pid_t child_pid;
char *strs[100] = {NULL}; 

child_pid = fork();
if (child_pid == 0) {
    split(read_str, strs);
    execvp(strs[0], strs);
    printf("Failed\n");
}
else {
    waitpid(child_pid, NULL, 0);
    for (y = 0; y < 100; y++) free(strs[y]);
}

和这个功能

void split(char *str, char **splitstr) {      
    char *p;      
    int i=0;      
    p = strtok(str," "); 
    while(p!= NULL) {        
        splitstr[i] = malloc(strlen(p) + 1);
        if (splitstr[i]) strcpy(splitstr[i], p);
        i++;
        p = strtok(NULL, " ");       
    } 
}

第一个代码块处于while循环中并不断询问用户输入。无论如何,如果execvp返回,则发生错误并且打印失败,然后如果我输入两个更有效的命令,则会出现内存损坏错误...

有谁看到我在这里做错了什么?

1 个答案:

答案 0 :(得分:0)

  

我在这里做错了什么

有几件事。

  • execvp失败时,孩子会进入while循环的开头,现在你已经两个孩子和父阅读输入。打印exit(1)后,您要执行的是"Failed"
  • 如果您这样做,那么strs永远不会在父级中分配,并且不需要是free() d。您可以将strs的定义移至if (child_pid == 0) {,您无需担心free任何内容。

这并不能解释您的内存损坏问题,如下所示:

  • 失败execvp让孩子C1读取输入。 C1malloc()数组中有strs个条目。
  • 现在C1获取输入,fork() s C2waitpid。然后C1free个条目上调用strs,它们就会悬空(你应该NULL出来)。
  • 现在C1再次获取输入,fork s C3waitpid为它,并在上调用free strs条目,导致您观察到双重free和腐败。