2012-06-19 3 views
5

私はいくつかのファイル機能を学んでいるので疑問があります。なぜclose()を使用してファイルを閉じる必要がありますか?

ファイルを閉じるためにclose()に電話する必要があるのはなぜですか?ファイルを読み書きした後にclose()に電話しなかった場合、どうなるでしょうか? close()に電話しても、ファイル記述子を使用できますか?

+1

以下の回答では、close()はバッファをディスクにフラッシュします。しかし、close()はPOSIX関数であり、POSIX close()には該当しません。ロックを解除してリソースを解放します。 –

答えて

7
  • ファイルの背後にバッファリングがあり、クローズしないと、データが失われる可能性があります。

  • OSに制限されたリソース(開いているファイルの数など)がある場合、ファイルをクローズしないとシステムリソースを浪費しています。

  • ファイルがクローズされると記述子を使用すると、せいぜい無意味である大規模なバグが最悪で(それが解放された後にメモリを使用してのようなビット)

+4

ここでのいくつかの答えは、close()ではバッファがフラッシュされるが、実際は真ではないと主張しています。POSIX close()はフラッシングを起こさず、データがデバイスに書き込まれるかどうかに関係しません。 –

2

読み込み用に開いたファイルを閉じないと、同時書き込みがブロックされます。 書き込みのために開いたファイルを閉じないと、バッファに保存されている最後に書き込まれたデータが失われます。

そして、既に閉じられているファイルの記述子を使用しないでください。これは意味がありません。

0

あなたが書き込みを使用してファイルに書き込みます( )システムコールでは、すぐにファイルに書き込まれません。だからあなたの操作の後、あなたは、バッファがファイルにフラッシュされ、変更が持続するようにclose()を呼び出さなければなりません。 close()を呼び出した後、ファイル記述子を使用することはできません。

+4

write()は、ユーザ空間からシステムバッファにデータをコピーします。システムバッファは、システムの都合やsync()のときにフラッシュされます。 close()には、バッファのフラッシュ時に*ベアリング*がありません。ファイルロックを解放し、リソースを解放するだけです。 –

0

ファイルを閉じる: ファイルを終了するときは、関数fclose()を使用してファイルを閉じる必要があります。

fclose(ifp); 
fclose(ofp); 

ファイルを閉じることは、特に出力ファイルでは非常に重要です。その理由は、出力がしばしばバッファリングされるからです。これは、あなたが何かを書くためにCを伝える際に、例えば、

fprintf(ofp, "Whatever!\n"); 

が、それは必要がすぐにディスクに書き込まれませんが、メモリ内バッファに終わる可能性があることを意味します。バッファがいっぱいになると

---------------------------------------------- 
| a | b | c | W | h | a | t | e | v | e | r | 
---------------------------------------------- 
| ! | \n | | | | | | | | | | 
---------------------------------------------- 
| | | | | | | | | | | | 
---------------------------------------------- 
| | | | | | | | | | | | 
---------------------------------------------- 
... 

(またはとき(バッファがこの図にもかかわらず、実際には1次元である。):

サンプル出力バッファをこの出力バッファは一時的にテキストを開催しますファイルが閉じている場合)、データは最終的にディスクに書き込まれます。

リファレンスhttp://www.cs.bu.edu/teaching/c/file-io/intro/

+2

わずかな修正。ファイルが 'fclose'だけで閉じられるべきであることを示すあなたの答えは_seems_です。 'close'でファイルを閉じることもできます。 'fclose'はファイルポインタを取り、' close'はファイル記述子を取ります。また、多くの実装では、改行文字 '\ n 'が発生したときにバッファをフラッシュします。 –

+0

訂正してくれてありがとうございます。 :) – Hrishikesh

+0

質問はfclose()ではなくclose()についてです。あなたがここに書いたものは、実際にclose()の真実です。そして、Pavanの発言はおそらくもっと悪いです... fcloseとfcloseとopen(またはcreat)のペアとのペアを閉じる。その違いはファイルポインタとファイル記述子の間だけではなく、かなり異なる抽象化/ API間の違いです(そのうちの1つは、他のものを介して実装される可能性があります)。 –

2

近い()関数は、プログラムとハンドルで識別されたオープン・ファイルとの間の接続を閉じます。どれ書き込まれていないシステムバッファをディスクにフラッシュされ、ファイルが使用するシステムリソースが

をリリースしている太字の部分は、ファイルは、ファイルを閉じる

を閉じる必要がありますなぜ最大の理由は、次のような結果を持っています:

1)ファイル記述子の割り当てが解除されています。
2)ファイルのプロセスが所有するすべてのレコードロックがロック解除されます。
3)パイプまたはFIFOに関連するすべてのファイル記述子が閉じられた場合、未読データは破棄されます。あなたがバッファに最初の書き込みをファイルに書き込むとき

+1

+1 close()がデータをフラッシュすると誤って宣言していないことは驚くべきことです。 –

0
  • は、いくつかの 機能は、フラッシュを呼び出し、データがファイルへ書き込まれますが、 他の人がちょうどバッファに書き込みます。バッファがいっぱいになると、フラッシュを直接呼び出さずにファイルに をフラッシュします。確かめたい場合はいつでも をフラッシュすることもできます。
  • ファイルディスクリプタを閉じた後でファイルディスクリプタを使用することはできません。
関連する問題