虽然循环永远不会退出EOF

时间:2012-09-22 03:46:25

标签: c while-loop infinite-loop eof

我在C中编写自己的shell,我需要检测EOF(当我运行./myshell < commands.txt时)

commands.txt包含:

ls
pwd

这些都可以在程序中单独运行。但是当我用文本文件运行它时,我得到一个无限循环。

在shell的while(1)循环中,我要做的第一件事是:

if (feof(stdin)) { my_exit(); }

my_exit只是:

void my_exit() {
    printf("End of file! Bye\n");
    exit(0);
}

exit(0)结束程序(和循环)吗?我为什么要

  

文件结束!文件的结尾!文件的结尾!文件的结尾!文件的结尾!文件的结尾!再见......等等。

我也尝试过fgets == NULL方式。相同的循环

3 个答案:

答案 0 :(得分:3)

问题是feof()告诉您LAST输入操作是否遇到了EOF。但是在下一次迭代之前你不会检查它。所以当你在EOF时,你会fgets()然后尝试使用它返回的空结果。

发生的事情是您fork()子进程,然后使用空命令名称调用execvp()。这是失败的,因此子进程返回到循环的开头,并执行相同的操作。同时,父进程调用my_exit()。因此,每个子进程都会分叉自己的另一个子进程,然后退出。

答案 1 :(得分:0)

feof的工作方式是,只要没有读取命中EOF,它就会返回false。 feof本身不检查流,但检查是否已设置EOF指示符,这在fgets失败时发生。

在控制循环中使用feof确实不是一个很好的做法。

验证EOF的一个例子是:

while( fgets(line, sizeof(line), fp) != NULL )
  fputs(line, stdout);

答案 2 :(得分:-3)

你可以尝试这样......

int a=1;
while(a)
{
    if (feof(stdin)) {
        a = 0;
    }
}
printf("End of file! Bye\n");
exit(0);