C:在达到特定大小限制后写入 RAW 磁盘时 write() 失败

C : write() fails while writing to a RAW disk after specific size limit reached

我正在使用 C 程序 open(), close(), read(), write() 技术将大文件复制到 RAW 磁盘。磁盘大小为 20 GB,文件大小为 17 GB,但每次写入 945 MB 左右后 write() 都会抛出 No space left on device 错误。

我有 运行 fdisk -l /dev/sdb 和 returns 20.5 GB 并且 du /dev/sdb945126569

然后我尝试了,cat mylargefile > /dev/sdb 它也抛出相同的 No space left on device 错误,然后我 cat /dev/sdb > /tmp/sdb.img 它正常完成。然后我做 ls -ld /tmp/sdb.img 它响应 945126569

我可以使用同一张磁盘创建 ext4 文件系统并对其进行格式化,没有任何问题,因此磁盘错误的可能性很小。 (我猜...)

我正在使用 Ubuntu 16.04 LTS amd64 OS 和最新的 GCC 来构建我的程序。

任何人都可以建议我哪里出错了或者需要做什么来避免这种情况?

如果 /dev/sdb 是块设备,

du /dev/sdb 应该说 0。也试试 blockdev --report /dev/sdb.

发生的事情是 一开始你根本没有名为 /dev/sdb 的设备文件,你创建了一个 常规 名为 /dev/sdb 的文件, 将 945 MiB 复制到其中。这填充了 /dev/ 所在的分区,因此您得到了错误。 fdisk 只读取第一个 945 MiB 中包含的分区 table,并认为它看到了 20 GiB 的硬盘。

当您执行 cat mylargefile > /dev/sdb 时, 文件 /dev/sdb 首先被截断为 0 大小,因此现在有 945 MiB 可用空间 space再次 cat 将继续填充。


要避免这种情况:请确保您使用正确的名称打开设备。在 C 中打开设备 without O_CREAT.