1

在我的 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 返回,则发生错误并且打印失败,然后如果我再输入两个有效命令,则会出现内存损坏错误...

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

4

1 回答 1

0

我在这里做错了什么

有几件事。

  • 失败时execvp,孩子会转到 while 循环的开头,现在您拥有孩子和父母的阅读输入。你想要做的是exit(1)在打印之后"Failed"
  • 如果你这样做了,那么strs永远不会在父级中分配,也不需要是free()d。您可以将定义移动strs到 中if (child_pid == 0) {,而您永远不需要担心free任何事情。

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

  • 失败execvp让孩子C1阅读输入。在其数组中C1malloc()ed 条目。strs
  • 现在C1得到输入,fork()sC2waitpids 。然后C1调用条目freestrs它们变得悬空(你应该NULL把它们拿出来)。
  • 现在C1再次获取输入,forks C3waitpids ,并再次调用相同free的条目,导致您观察到的双重和损坏。 strsfree
于 2013-01-20T03:02:44.173 回答