在我的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返回,那么发生了一个错误,并且打印失败,如果我再输入两个有效的命令,我会得到一个内存损坏错误...
有没有人看到我做错了什么?
发布于 2013-01-20 11:02:44
我在这里做错了什么
有几件事。
execvp失败时,子节点转到while循环的开头,现在您同时拥有了子节点和父节点的读取输入。您要做的是在打印"Failed".exit(1)操作,这样strs就永远不会在父级中分配,也不需要是free()d。您可以将strs的定义移到if (child_pid == 0) {中,而无需担心free任何内容。这并不能解释你的内存崩溃问题,它是这样的:
execvp让子C1读取输入。C1在其strs数组中具有malloc()ed条目。C1获取输入,fork()的C2和waitpid的输入。然后,C1对strs条目调用free,这些条目就会变得悬空(您应该将它们NULL出来)。C1再次获取输入,fork的C3,<代码>D38,并对相同的<代码>D40条目再次调用<代码>D39,从而导致双重<代码>D41和您观察到的损坏。<代码>H242<代码>F243https://stackoverflow.com/questions/14420749
复制相似问题