質問

もちろん、ほとんどの状況に対する即時の答えは&yes" であり、プロセスは割り当てたリソースを正しくクリーンアップする必要があると固く信じていますが、私の状況ではは、起動時に固定数のファイル記述子を開き、終了する前にそれらをすべて閉じる長時間実行システムデーモンです。

これは組み込みプラットフォームであり、コードをできるだけコンパクトにしようとしていますが、悪いスタイルは導入していません。しかし、とにかく終了する前にファイル記述子が閉じられるので、このファイル記述子のクリーンアップコードは目的を果たしますか?常にすべてのファイル記述子を閉じますか?

役に立ちましたか?

解決

使用後にファイル記述子を閉じると、コードが再利用可能になり、拡張しやすくなります。これは、それらを自動的に閉じさせる正当な理由がある場合のように思えます。

他のヒント

はい、OSがクリーンアップすることを知っていても、ファイル記述子を閉じてすべてのヒープメモリを解放します-そのようにして、valgrindまたは同様のツールを実行すると、多くのノイズは発生しません結果を簡単に確認できます。 fdリーク。

組み込みプラットフォームの美しい世界では、何が起こるかを言うのは本当に難しいです。ただし、私があなたの状況にあった場合、ファイルIDが実際にリリースされているかどうかを手動でテストします。そして、スペースがそれほど重要な場合は、この事実を他の場所に文書化できます。

ファイルディスクリプタのクローズを自動クリーンアップに任せることに関して懸念する1つの懸念は、そのファイルディスクリプタに書き込んだデータをどれだけ気にするか、また、書きます。

write()は(最初にopen()された方法に応じて)ブロックし、データが正常にコミットされるのを待つ必要がないため、基礎となるサブシステムがコミットに失敗するためクローズが失敗する場合があります書き込み待ちのため、失敗して終了し、errnoをEIOに設定します。書き込み内容に応じて、修正アクションを実行する場合としない場合があります。

確かに、これはデータの一貫性、つまりDBMSタイプのアプリケーション、またはバックアップの成功/失敗を報告することを本当に重視する場合です。多くの場合(ほとんどの場合)、それほど重要ではありません。close()を終了してクリーンアップ/終了を処理しても構いません。

man 3 exit:

....
All open stdio(3) streams are flushed and closed.  Files created by tmpfile(3) are removed.

したがって、mainを終了すると、mainの戻り値を使用してexit関数が効果的に呼び出されます。私はそれが悪いスタイルだと主張するでしょうが。個人的には、獲得したリソースを常に明示的に解放/閉鎖します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top