我是一个新的C程序员,正在尝试创建自己的shell。 Shell本身可以很好地工作并正确处理我的命令,但是当用户在命令行中输入EOF字符作为输入时,我的Shell就会无限循环。我的代码在下面以及我已经尝试过的内容中发布(我对使用GDB和Valgrind还是陌生的,但似乎都没有帮助我找到问题所在)。
我已经尝试过的内容:
我将函数调用完全替换为:
if (fgets(command_line, MAX_CANON, stdin) == NULL) {
printf("\nTo quit, please use the exit command: exit.\n");
}
据我所知,上述替换应处理用户输入的EOF字符。但是,使用fgets的实现也会导致无限的命令提示符循环。
下面是上面#1中提到的我当前的实现方式:
在main中调用的功能,用于读取用户的输入:
char *read_command_line(void)
{
//Declare an integer to hold the length of the string, a line to hold our output, and a variable getline can use to hold the generated buffer
int len;
char *line = NULL;
ssize_t bufsize = 0;
//Get the line from stdin
int retval = getline(&line, &bufsize, stdin);
if(retval == -1)
{
line = NULL;
return line;
}
//Determine the length of the line and set a null terminating byte to end the string and get rid of the trailing return
len = strlen(line);
line[len - 1] = '\0';
//Finally return the read in line
return line;
}
我的shell while循环从头开始读取行的地方:
//BEGIN SHELL
while (go)
{
//Signals are handled in the main.c
//Print the prompt
char cwd_loop[max_buf_size];
getcwd(cwd_loop, sizeof(cwd_loop));
printf("\n%s [%s]:> ", prompt_prefix, cwd_loop);
commandline = read_command_line();
if(commandline == NULL)
{
continue;
}
答案 0 :(得分:1)
当输入流已关闭时,如getline()
返回-1
或fgets()
返回NULL
所示,您不应继续提示并阅读其他输入。只需跳出循环就好像输入了exit
命令一样。
答案 1 :(得分:1)
根据您的代码
commandline = read_command_line();
if(commandline == NULL)
{
continue;
}
如果read_command_line
返回一个空指针(如果发生类似EOF
的错误,则返回空指针),则您继续循环,使其再次迭代。这次read_command_line
将再次 返回空指针,您将永远这样继续。
如果break
返回空指针,则应该 read_command_line
。