fprintfとfwriteでディスクに書き込むLINUXで実行するアプリケーションを作成しています。「ディスクがいっぱいです」というエラーをトラップし、ユーザーにスペースを増やすように促し、何も起こらなかったかのように操作を再開できるようにしたいと考えています。それに対する優雅な解決策はありますか?
3 に答える
fprintf()
およびへの各呼び出しの戻り値を確認しますfwrite()
。いずれかの呼び出しが負の値を返す場合は、がまたはに等しいかerrno
どうかを確認します。もしそうなら、おそらくディスク容量が不足しています。errno
EDQUOT
ENOSPC
fprintf()
ENOMEM
何もなかったかのように操作を再開することについては。それは少し難しいです。どのデータがディスクに正常に書き込まれたかを追跡する必要があります。ユーザーに通知し、再試行する時期であることをユーザーが示した後、そのデータの書き込みをその時点から再開できるようにするためです。エラーが発生しました。つまり、書き込みの状態を何らかの構造 (つまり、スタック上だけでなく) に保持して、書き込み関数から戻って後で再開できるようにすることを意味します。(それか、別のスレッドで書き込みを行い、スレッドにメインスレッドに通知させてから、メインスレッドが安全に続行できることを通知するまでブロックします...少しトリッキーになるかもしれませんが)
大きなチャンク (たとえば、64kB または 1MB) でスペースを予約し、カスタム ラッパーを使用fwrite
しfprintf
て、既に予約されている領域にのみデータが書き込まれるようにすることができます。これらのラッパーは、必要に応じてファイルに新しいディスク領域を割り当てます。次に、「ディスク容量不足」が実際に発生する可能性があるコード内のポイントはわずかしかありません。このエラーは、割り当てているだけであることがわかっている場合は比較的簡単に回復できます。
boostライブラリを使用できる場合は、非常に簡単です。
boost::filesystem::spaceは、ディスク容量に関する情報を返します。space メソッドへの入力はファイルへのパスであり、結果は容量、空き容量、および使用可能な容量を含む space_info 構造です。space_info の詳細については、こちらをご覧ください。