首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >execvp导致内存问题

execvp导致内存问题
EN

Stack Overflow用户
提问于 2013-01-20 09:15:55
回答 1查看 586关注 0票数 1

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

代码语言:javascript
复制
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]);
}

和这个函数

代码语言:javascript
复制
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返回,那么发生了一个错误,并且打印失败,如果我再输入两个有效的命令,我会得到一个内存损坏错误...

有没有人看到我做错了什么?

EN

回答 1

Stack Overflow用户

发布于 2013-01-20 11:02:44

我在这里做错了什么

有几件事。

  • execvp失败时,子节点转到while循环的开头,现在您同时拥有了子节点和父节点的读取输入。您要做的是在打印"Failed".
  • if后执行exit(1)操作,这样strs就永远不会在父级中分配,也不需要是free()d。您可以将strs的定义移到if (child_pid == 0) {中,而无需担心free任何内容。

这并不能解释你的内存崩溃问题,它是这样的:

  • 失败execvp让子C1读取输入。C1在其strs数组中具有malloc()ed条目。
  • 现在C1获取输入,fork()C2waitpid的输入。然后,C1strs条目调用free,这些条目就会变得悬空(您应该将它们NULL出来)。
  • 现在C1再次获取输入,forkC3,<代码>D38,并对相同的<代码>D40条目再次调用<代码>D39,从而导致双重<代码>D41和您观察到的损坏。<代码>H242<代码>F243
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14420749

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档