我在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
方式。相同的循环
答案 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);