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/sdb
说 945126569
然后我尝试了,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
.
我正在使用 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/sdb
说 945126569
然后我尝试了,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
.