C - 尝试在 linux 中构建一个简单的 shell 并在循环中使用 strtok、realloc 时遇到问题
C - Trying to build a simple shell in linux and having trouble with strtok, realloc in a loop
尝试在 linux 中为作业构建 shell 实现,但遇到了问题。在进入循环 运行 3/4 次后出现以下错误
* `./1' 中的错误:realloc():下一个大小无效:0x000000000132c150 *
已中止(核心已转储)
我省略了部分代码,因为它很长,而且我知道它们没有问题。如果您需要其他部分,我也可以添加它们。
提前致谢:)
注意:argc 和 argv 是全局变量
int argc = 0;
char **argv = NULL;
int main(void)
{
while(1)
{
catch_signal();
printDate();
readCommand();
if(strcmp(argv[0], "cd") == 0)
{
changeDirectory();
}
else
{
executeCommand();
}
//free(argv);
}
}
void readCommand()
{
char *buffer = NULL;
char *token = " ";
char *p;
size_t len = 0;
int i = 0;
getline(&buffer, &len, stdin);
p = strtok(buffer, "\n");
p = strtok(buffer, token);
while(p)
{
argv = realloc(argv, sizeof(char *) * ++i);
argv[i - 1] = p;
p = strtok(NULL, token);
}
argc = i;
argv[argc] = NULL;
free(p);
}
void executeCommand()
{
int status;
pid_t pid;
if((pid = fork()) < 0)
{
printf("Error: forking child process failed.");
}
else if(pid == 0)
{
if(execvp(argv[0], argv) < 0)
{
printf("error");
exit(1);
}
}
else
{
while(wait(&status) != pid);
}
}
您重新分配的 argv 数组 1 指针太短。最终 NULL
指针的 space 不足。考虑用以下代码替换 while(p)
循环:
if (!p) {
/* deal with empty command line */
}
while (p) {
argv = realloc(argv, sizeof(char *) * (i + 2));
argv[i++] = p;
p = strtok(NULL, token);
}
如果用户输入了实际命令,p
应该以 NULL
开头。但是,如果缓冲区包含一个空字符串或只是一个空白字符串怎么办?在这些情况下,strtok
将直接 return NULL
。你应该忽略这样的命令行。
尝试在 linux 中为作业构建 shell 实现,但遇到了问题。在进入循环 运行 3/4 次后出现以下错误
* `./1' 中的错误:realloc():下一个大小无效:0x000000000132c150 * 已中止(核心已转储)
我省略了部分代码,因为它很长,而且我知道它们没有问题。如果您需要其他部分,我也可以添加它们。 提前致谢:)
注意:argc 和 argv 是全局变量
int argc = 0;
char **argv = NULL;
int main(void)
{
while(1)
{
catch_signal();
printDate();
readCommand();
if(strcmp(argv[0], "cd") == 0)
{
changeDirectory();
}
else
{
executeCommand();
}
//free(argv);
}
}
void readCommand()
{
char *buffer = NULL;
char *token = " ";
char *p;
size_t len = 0;
int i = 0;
getline(&buffer, &len, stdin);
p = strtok(buffer, "\n");
p = strtok(buffer, token);
while(p)
{
argv = realloc(argv, sizeof(char *) * ++i);
argv[i - 1] = p;
p = strtok(NULL, token);
}
argc = i;
argv[argc] = NULL;
free(p);
}
void executeCommand()
{
int status;
pid_t pid;
if((pid = fork()) < 0)
{
printf("Error: forking child process failed.");
}
else if(pid == 0)
{
if(execvp(argv[0], argv) < 0)
{
printf("error");
exit(1);
}
}
else
{
while(wait(&status) != pid);
}
}
您重新分配的 argv 数组 1 指针太短。最终 NULL
指针的 space 不足。考虑用以下代码替换 while(p)
循环:
if (!p) {
/* deal with empty command line */
}
while (p) {
argv = realloc(argv, sizeof(char *) * (i + 2));
argv[i++] = p;
p = strtok(NULL, token);
}
如果用户输入了实际命令,p
应该以 NULL
开头。但是,如果缓冲区包含一个空字符串或只是一个空白字符串怎么办?在这些情况下,strtok
将直接 return NULL
。你应该忽略这样的命令行。