我正在调试一个 fuse 文件系统,它报告了错误的du
. 事实证明,它正在将st_size / st_blksize
[*] 放入结构中st_blocks
。stat
Linux手册页stat(2)
说:
struct stat {
…
off_t st_size; /* total size, in bytes */
blksize_t st_blksize; /* blocksize for file system I/O */
blkcnt_t st_blocks; /* number of 512B blocks allocated */
…
};
st_blksize
无论如何,如果在 512B 块中是什么意思st_blocks
?
[*] 无论如何看起来都是错误的,因为整数除法不考虑小数部分......
st_blocks
定义为_块的大小是特定于实现的。由于历史原因,在 Linux 上它总是 512 字节;特别是,它曾经是磁盘扇区的典型大小。
st_blksize
不相关;它是它表示 I/O 的首选大小,即在一次操作中应传输的数据量以获得最佳结果(忽略 I/O 堆栈中的其他层)。