在我的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返回,则发生错误并且打印失败,然后如果我输入两个更有效的命令,则会出现内存损坏错误...
有谁看到我在这里做错了什么?
答案 0 :(得分:0)
我在这里做错了什么
有几件事。
execvp
失败时,孩子会进入while循环的开头,现在你已经两个孩子和父阅读输入。打印exit(1)
后,您要执行的是"Failed"
。strs
永远不会在父级中分配,并且不需要是free()
d。您可以将strs
的定义移至if (child_pid == 0) {
,您无需担心free
任何内容。这并不能解释您的内存损坏问题,如下所示:
execvp
让孩子C1
读取输入。 C1
在malloc()
数组中有strs
个条目。 C1
获取输入,fork()
s C2
和waitpid
。然后C1
在free
个条目上调用strs
,它们就会悬空(你应该NULL
出来)。C1
再次获取输入,fork
s C3
,waitpid
为它,并在上调用free
再次发生em> strs
条目,导致您观察到双重free
和腐败。