0

私はCで独自のシェルを作成しており、EOFを検出する必要があります(実行時の場合./myshell < commands.txt

コマンド.txtに含まれるもの:

ls
pwd

これらは両方とも、プログラム内から個別に正常に実行されます。しかし、テキストファイルで実行すると、無限ループが発生します。

while(1)シェルのループで、最初に行うことは次のとおりです。

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()、LAST入力操作がEOFに遭遇したかどうかを通知することです。ただし、次の反復までこれをチェックしていません。したがって、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 に答える