ホームページ  >  記事  >  運用・保守  >  Linux eof とはどういう意味ですか?

Linux eof とはどういう意味ですか?

藏色散人
藏色散人オリジナル
2023-03-25 09:20:092517ブラウズ

linux eof は通常、ファイルの終わりを指します。EOF はコンピュータ用語で、End Of File の略です。オペレーティング システムでは、データ ソースに読み込むデータがもうないことを示します。Linux では、 , 改行 最初に「Ctrl D」を押してEOFを表します。

Linux eof とはどういう意味ですか?

#このチュートリアルの動作環境: linux5.9.8 システム、Dell G3 コンピューター。

Linux eof とはどういう意味ですか?

EOF はコンピューター用語で、End Of File の略で、オペレーティング システムでは、データ ソースに読み込むデータがなくなったことを示します。 Linux では通常、ファイルの終わりを指します。

EOF を使用して、プログラムがファイルの最後まで読み取ったかどうかを判断するにはどうすればよいですか?

Linux システムにおける非常に重要な考え方は、すべてがファイルであるということです。標準入力、ファイル システム内の通常のテキスト ファイル、またはネットワーク ストリームのいずれであっても、それらはファイルとみなされ、読み取り/書き込み機能を通じて読み取りおよび書き込みが可能です。そのため、ファイルの種類によって、ファイルの最後まで読み込まれたかどうかの判断方法が異なります。 ##標準入力ファイル (stdin)

  • ソケット ストリーム ファイル

  • これら 3 種類のファイルは、読み込まれたかどうかを判断するために導入されます。ファイルの最後まで。メソッド。

  • 通常のテキスト ファイル

  • ここでの通常のファイルとは、Linux システムに存在するファイル マネージャーを通じて通常確認できるテキスト ファイルとファイル サイズを指します。固定されています。

この種類のファイルの場合、Linux システムは、通常のテキスト ファイルがファイルの最後まで読み取られたかどうかを判断します。読み取り関数は、開かれたファイルの読み取りポインターを維持し、次に、このポインタを使用して、ファイルの開始位置を決定します。ポインタの値を減算して、ファイルの開始位置に対する相対的なオフセット バイト数を取得します。最後に、そのようなオフセット バイト数とファイル自体のサイズが比較されます。ファイルの開始位置に対する相対的なオフセット バイト数がファイル自体よりも大きい場合、ファイルの終わりが読み取られたことを示す EOF 定数が返されます。

つまり、上記の記述によれば、ファイルに n 文字が含まれている場合、while ループの内部操作は n 1 回実行されます。したがって、最も安全な書き方は次のようになります。

int c = fgetc(fp);
while (c != EOF) {
    do something;
    c = fgetc(fp);
}
if (feof(fp)) {
    printf("\n End of file reached.");
} else {
    printf("\n Something went wrong.");
}

標準入力ファイル

標準入力ファイル (stdin) は、周辺機器のキーボード入力に対応し、Linux ではシステムでは、ファイル、正確にはストリーム ファイルに抽象化されます。この種のファイルと上記の通常のテキスト ファイルの最大の違いは、ファイル サイズが固定されておらず、水道管の入口端のようなものでいつでも入力を受け取ることができることです。

標準入力ファイルのストリーミング特性上、上記のファイルサイズ比較方法ではファイルの最後まで読み込まれたかどうかを判断することができません。したがって、Linux システムが標準入力ファイルがファイルの終わりまで読み込まれたかどうかを判断する方法は、ファイルの終わりを表す特別な入力マークを設定することです。Linux システムでは、このマークはキーの組み合わせ Ctrl D です。システムがこのキーの組み合わせをキャプチャすると、r read 関数は EOF 定数を返し、標準ファイルの最後まで読み取ったことをプログラムに通知します。

ソケット ストリーム ファイル

ソケット ストリーム ファイルは標準入力ファイルに似ており、ネットワークからデータを読み取るため、上記 2 つの決定方法はいずれもありませんファイルが最後まで読み取られたかどうかは、ソケット ストリーム ファイルに適用されます。

では、クライアント プロセスは、サーバー プロセスがすべてのデータの書き込みを完了したかどうかをどのように判断するのでしょうか?

ソケット ストリーム ファイルでは、クライアント プロセスが読み取り関数を通じてリモート サーバー プロセスによって送信されたデータを読み取るときに、ブロッキング I/O を使用して読み取ります。クライアントとサーバー間の接続が切断されない限り、サーバーがソケットにデータを書き込まない場合、新しいデータがサーバーに書き込まれるまでクライアントの読み取り操作はブロックされます。

サーバー プロセスがソケット接続を閉じると、クライアントはサーバーから送信された TCP プロトコル FIN パケットを受信し、クライアント プロセスは当初、サーバー プロセスからのデータの受信を待機している読み取りでブロックされます。関数はこの時点で起動され、値 0 を返します。これは、先ほどの 2 種類のファイルがファイルの終わりを読み込んだ後に EOF (値は -1) を返すのとは少し異なりますので、プログラム内でソケットから読み込む際に、終わりを判断するためのフラグを用意します。データ ストリームの値は -1 ではなく 0 です。

Linux では、新しい行の先頭で Ctrl-D を押すと EOF を意味します (行の途中で Ctrl-D を押すと、「標準入力」バッファ領域を出力することになるため、これはCtrl-D を 2 回押す必要があります); Windows では、Ctrl-Z は EOF を意味します。 (ちなみに、Linux で Ctrl-Z を押すと、プロセスが中断され、バックグラウンドで一時停止されます。fg コマンドを使用すると、フォアグラウンドに戻すことができます。Ctrl-C を押すと、プロセスが終了します。)

那么,如果真的想输入Ctrl-D怎么办?这时必须先按下Ctrl-V,然后就可以输入Ctrl-D,系统就不会认为这是EOF信号。Ctrl-V表示按”字面含义”解读下一个输入,要是想按”字面含义”输入Ctrl-V,连续输入两次就行了。

所以,一个简单的从 socket 文件读取数据的样例代码,通常是下面这样的:

char recvline[MAX_LINE_LENGTH];
int read_count;
while ((read_count = read(sock_fd, recvline, MAX_LINE_LENGTH)) > 0)
{
    printf("%s\n", "String received from server: ");
    fputs(recvline, stdout);
}

总结

所以,一定要记住这样一个概念:EOF 是一个常量而不是一个字符!。

推荐学习:《linux视频教程

以上がLinux eof とはどういう意味ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。