3

Unix C プログラミングでは、プロセスが終了する前に明示的にファイル ハンドルを閉じることをお勧めしますか?それとも、OS にファイル ハンドルを閉じさせて不要なコードを避けるようにすることをお勧めしますか?

2 つのうちどちらが一般的に好ましい代替手段と見なされますか?

例:

int main (int argc, char* argv[])
{
    int sd;
    sd = socket(...);

    // Snip

   close(sd); // Good or bad practice?
   return 0;
}
4

7 に答える 7

10

一般に、開始と終了を行っているコードは、プロセスがすぐに終了するかどうかを認識していないため、明示的なコードを含めることをお勧めします。

コードが最上位の main() 関数にある場合でも、コードが再利用される場合に備えて、それは良い考えです。

于 2009-01-19T14:50:30.617 に答える
5

それらを自分で閉じることをお勧めします。

おそらく、特定の「ファイル」を使い終わった後、プログラムが大きくなり、しばらく終了しない場合に備えて、これは良い習慣だからです。

例外は、プロセスが開かなかった stdin、stdout、および stderr です。

ちなみに、UNIX 用語は「ファイル記述子」です。

于 2009-01-19T14:49:09.777 に答える
2

可能であれば、それらを閉じることをお勧めします。

ファイルが後でではなくすぐに閉じられるようにプログラムを変更した場合、close()後でファイル I/O がリファクタリングされたときにそれを追加することを覚えておく必要はありません。

于 2009-01-19T14:49:12.320 に答える
2

私は大学以来 unix を使用していませんが、ファイル ハンドルを閉じる unix に依存することで、コードを使用できる方法の数を減らしています。

コードを別のプラットフォームに移植する必要がある場合、または長期実行サービスとして実行するためにコードを変更する必要がある場合、明示的なリソース管理がなければ、すぐにリソースが不足してしまいます。

これがお役に立てば幸いです。

于 2009-01-19T14:49:37.263 に答える
1

プログラムを続行するが記述子が不要になった場合は、記述子を閉じることをお勧めします。

繰り返しますが、ファイル記述子のタイプによって異なります。たとえば、ソケットを close() すると、ソケットがフラッシュされます。これが失敗した場合は、再試行することをお勧めします。

于 2009-01-19T14:48:57.640 に答える
0

ほぼ「ユニバーサル」だと思います。OSリソースを開いている場合は、使い終わったらすぐに閉じてください。そうすれば、それらのリソースを解放して、他のアプリケーションで使用できるようになります。

OSに依存してハンドルを閉じることにより、ハンドルは不要になったと思ったときに閉じるだけです(たとえば、アプリの終了)。常にシステムリソースを解放する必要があります。

于 2009-01-19T15:00:27.367 に答える
0

開いているファイルを閉じることが適切であると考えられる圧倒的に最も重要な理由は、I/O エラーを見つけてユーザーに報告できるようにするためです。同じ理由で、stdout と stderr に書き込む場合は、おそらくフラッシュ (またはクローズ) することをお勧めします。

于 2009-01-19T15:38:38.757 に答える