私は約10bから16000bのチャンクでファイルに書き込んでいますが、突然すべてのチャンクが約4050バイト(具体的には、4050、4051、4074バイトの順)で切断されます。これは、後続の書き込みによって、書き込まれるはずのデータが上書きされ、データが台無しになることを意味します。4050b未満のチャンクはすべて正常に書き出されます。
残念ながら再現できません。私が持っているのはめちゃくちゃなファイルだけなので、これを引き起こす何かを探してデバッグしています。
デバッグすると、cのwrite()関数が内部で呼び出され(これはJavaコードのFileChannel.write()ですが、標準ライブラリはcのwriteを呼び出し、書き込まれたバイト数が0より大きいことのみをチェックします)、そのドキュメントが要求されたすべてのデータが書き出されることを保証するのではなく、書き込まれた量がわかるだけです。
私はJavaランドで書き戻されたバイトをチェックしません(しかし、私はそれを取得します、関数シグネチャはほとんど同じです)ので、修正は非常に簡単です。ただし、これを再現できないため、実際の問題を修正したかどうかはわかりません。したがって、私は、cの第一人者が、私がクラックを吸っている、またはwrite()が一度に約4050バイトを超えて書き込むことができない正当な状況があることを教えてくれることを望んでいます。
これは、64ビットLinuxカーネルバージョン3.0.0-26で実行されています。
編集:以下のコメントに従って展開するには:
通常のファイルシステムファイルに書き込んでいます。このコンテキストで非ブロッキングが何を意味するのかわかりません。コールバックなどを使用していませんが、OSにディスクにフラッシュするように明示的に指示することはチャンクごとに行われません。ファイルは、JavaのRandomAccessFile、「rw」モードを使用して開かれます。