输入EOF时Shell不断循环C

时间:2018-09-30 16:21:21

标签: c shell fgets eof getline

我是一个新的C程序员,正在尝试创建自己的shell。 Shell本身可以很好地工作并正确处理我的命令,但是当用户在命令行中输入EOF字符作为输入时,我的Shell就会无限循环。我的代码在下面以及我已经尝试过的内容中发布(我对使用GDB和Valgrind还是陌生的,但似乎都没有帮助我找到问题所在)。

我已经尝试过的内容:

  1. 下面的当前实现尝试捕获getline的返回值,并处理返回-1(读取EOF时)的情况。但是,这只会导致shell不断循环提示
  2. 我将函数调用完全替换为:

    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;
    }

2 个答案:

答案 0 :(得分:1)

当输入流已关闭时,如getline()返回-1fgets()返回NULL所示,您不应继续提示并阅读其他输入。只需跳出循环就好像输入了exit命令一样。

答案 1 :(得分:1)

根据您的代码

commandline = read_command_line();  

if(commandline == NULL)
{
    continue;
}

如果read_command_line返回一个空指针(如果发生类似EOF的错误,则返回空指针),则您继续循环,使其再次迭代。这次read_command_line将再次 返回空指针,您将永远这样继续。

如果break返回空指针,则应该 read_command_line