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

问题描述:

我正在使用C程序open(), close(), read(), write()技术将大文件复制到RAW磁盘。磁盘大小为20 GB,文件大小为17 GB,但在每次写入945 MB后出现No space left on device错误。C:在达到特定大小限制后写入RAW磁盘时写入()失败

我已经运行fdisk -l /dev/sdb,并返回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文件系统,并没有任何问题格式化,所以磁盘错误是不可能的。 (我猜...)

我使用最新的GCC的Ubuntu 16.04 LTS amd64操作系统来构建我的程序。

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

+0

du/dev/sdb应该说** 0 **。 –

+0

请记住,磁盘大小通常是1000的倍数,而文件大小是1024的倍数。是否检查过该差异? –

+0

@Someprogrammerdude pebkac错误。 –

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

那么'猫'失败呢?以及如何实际访问磁盘?在清理文件/ dev/sdb并重启后看到/ dev/sdb中的RAW磁盘并且'du'返回'0' – Anirban

+0

“猫失败怎么办?”/ dev存在的分区有945 MiB空闲空间。当你将'cat>'放入它时,文件首先被截断为0,然后写入945 MiB,并且空间不足。 –

+0

@Anirban更新。 –