0

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

commands.txt 包含:

ls
pwd

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

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

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

my_exit很简单:

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

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

文件结束!文件结束!文件结束!文件结束!文件结束!文件结束!再见....等

我也尝试过这样做fgets == NULL。相同的循环

4

3 回答 3

3

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

发生的事情是你fork()是一个子进程,然后execvp()用一个空的命令名调用。这是失败的,所以子进程返回到循环的开头,并做同样的事情。同时,父进程调用my_exit(). 因此,每个子进程都会派生出自己的另一个子进程,然后退出。

于 2012-09-22T04:26:43.453 回答
0

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

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

验证 EOF 的示例如下:

while( fgets(line, sizeof(line), fp) != NULL )
  fputs(line, stdout);
于 2012-09-22T08:18:21.200 回答
-3

你可以试试这样...

int a=1;
while(a)
{
    if (feof(stdin)) {
        a = 0;
    }
}
printf("End of file! Bye\n");
exit(0);
于 2012-09-22T04:05:41.060 回答