私はいくつかのファイル機能を学んでいるので、疑問があります。
close()
ファイルを閉じるために呼び出す必要があるのはなぜですか? ファイルの読み取り/書き込み後に呼び出さなかった場合close()
、何が起こる可能性がありますか? そして、私が呼び出したclose()
場合、ファイル記述子を引き続き使用できますか?
私はいくつかのファイル機能を学んでいるので、疑問があります。
close()
ファイルを閉じるために呼び出す必要があるのはなぜですか? ファイルの読み取り/書き込み後に呼び出さなかった場合close()
、何が起こる可能性がありますか? そして、私が呼び出したclose()
場合、ファイル記述子を引き続き使用できますか?
ファイルの背後に何らかのバッファリングがあり、close を呼び出さない場合、データが失われる可能性があります。
OS のリソースが限られている場合 (開いているファイルの数など)、ファイルを閉じないとシステム リソースが無駄になります。
ファイルが閉じられた後に記述子を使用することは、せいぜい無意味であり、最悪の場合、大規模なバグです (メモリが解放された後にメモリを使用するのと少し似ています)。
close() 関数は、プログラムとハンドルによって識別される開いているファイルとの間の接続を閉じます。書き込まれていないシステム バッファはディスクにフラッシュされ、ファイルが使用していたシステム リソースは解放されます。
太字部分は、ファイルを閉じる必要がある主な理由です
ファイルを閉じると、次の結果が生じます。
1) ファイル記述子の割り当てが解除されます。
2) ファイルのプロセスが所有するすべてのレコード ロックが解除されます。
3) パイプまたは FIFO に関連付けられたすべてのファイル記述子が閉じられると、読み取られていないデータは破棄されます。
読み取り用に開かれたファイルを閉じないと、同時書き込みがブロックされる可能性があります。書き込み用に開かれたファイルを閉じないと、OS がバッファに保持している最後に書き込まれたデータが失われる可能性があります。
また、すでに閉じられているファイルの記述子を使用しないでください。これは意味がありません。
ファイルを閉じる: ファイルの処理が完了したら、関数 fclose() を使用してファイルを閉じる必要があります。
fclose(ifp);
fclose(ofp);
特に出力ファイルでは、ファイルを閉じることは非常に重要です。その理由は、出力がしばしばバッファリングされるためです。これは、C に何かを書き出すように指示すると、たとえば次のようになることを意味します。
fprintf(ofp, "Whatever!\n");
すぐにディスクに書き込む必要はありませんが、メモリ内のバッファに格納される可能性があります。この出力バッファは一時的にテキストを保持します:
出力バッファの例:
----------------------------------------------
| a | b | c | W | h | a | t | e | v | e | r |
----------------------------------------------
| ! | \n | | | | | | | | | |
----------------------------------------------
| | | | | | | | | | | |
----------------------------------------------
| | | | | | | | | | | |
----------------------------------------------
...
(この描画にもかかわらず、バッファーは実際には 1 次元です。)
バッファーがいっぱいになると (またはファイルが閉じられると)、データは最終的にディスクに書き込まれます。
write() システム コールを使用してファイルに書き込む場合、すぐにはファイルに書き込まれません。そのため、操作後に close() を呼び出して、バッファーがファイルにフラッシュされ、変更が保持されるようにする必要があります。close() を呼び出した後は、ファイル記述子を使用できません。