2017-08-09 7 views
-2

Cプログラムopen(), close(), read(), write()テクニックを使用してRAWディスクに大きなファイルをコピーしています。ディスクサイズは20 GBで、ファイルサイズは17 GBですが、書き込む度に毎回945 MB write()がスローされますNo space left on deviceエラーです。C:特定のサイズ制限に達した後にRAWディスクに書き込み中にwrite()が失敗する

私は fdisk -l /dev/sdbを実行し、20.5ギガバイトを返してきた

du /dev/sdb

945126569は、その後、私はそれがあまりにも同じNo space left on deviceエラーをスローし、私はそれが正常に完了しcat /dev/sdb > /tmp/sdb.imgを行い、cat mylargefile > /dev/sdbを試してみましたと言います。そして、私はそれが945126569

を応答ls -ld /tmp/sdb.img私はext4ファイルシステムを作成するために、同じディスクを使用し、何の問題もなく、それをフォーマットするため、ディスクエラーが起こりそうであることができます。 (私が推測する...)

私のプログラムをビルドするために、最新のGCCでUbuntu 16.04 LTS amd64 OSを使用しています。

誰かが私が間違っているか、これを避けるために何が必要なのかを誰にでも示唆できますか?

+0

'du/dev/sdb'は** 0 **と言うべきです。 –

+0

ディスクサイズは通常1000の倍数で、ファイルサイズは1024の倍数であることを忘れないでください。その矛盾をチェックしましたか? –

+0

@Someprogrammerdude pebkacエラー。 –

答えて

1

du /dev/sdbは、とする必要があります。/dev/sdbはブロックデバイスです。またblockdev --report /dev/sdbを試してください。 初めにあなたはすべての/dev/sdbという名前のデバイスファイルを持っていなかった、とあなたは/dev/sdbという名前定期ファイルを作成したこと

何が起こったことは、 はそれに945 MIBがコピーされます。これにより、/dev/のパーティションが満たされ、エラーが発生します。 fdiskは最初の945 MiBに含まれているパーティションテーブルを読み込み、20 GiBのハードディスクを認識したと考えます。

あなたがcat mylargefile > /dev/sdbを行うと、ファイル/dev/sdbが最初にサイズ0に切り詰められ、その945のMIBの空き容量がcatを埋めるために進めることを改めて今そこにあるされています。


これを避けるには:正しい名前でデバイスを開いてください。 Cではを開かずにO_CREATを付けないでください。

+0

それでは 'cat'は失敗しますか?実際にディスクにアクセスする方法は?/dev/sdbファイルをクリーンアップして再起動してRAWディスクを/ dev/sdbに表示し、 'du'が' 0'を返した後に面白いです – Anirban

+0

'' catの失敗について ''/dev'が存在するパーティションには945 MiBの空きスペース。 'cat>'を実行すると、ファイルは最初にサイズ0に切り捨てられ、945 MiBが書き込まれ、スペースがなくなります。 –

+0

@Anirbanが更新されました。 –

関連する問題