Filesystems stat()和Cygwin中的块大小

Filesystems stat()和Cygwin中的块大小,filesystems,cygwin,stat,Filesystems,Cygwin,Stat,我想要类似于du功能的代码。我通过使用stat()函数尝试了这一点。我已经了解了从stat()报告的st_块是磁盘中分配的实际块号。块大小应为512字节,st_blocks*512应为文件分配的字节数。然而,我发现Cygwin环境令人困惑。首先,我使用dd命令创建一个8KB的文件 % dd if=/dev/urandom bs=4096 count=2 of=testfile 2+0 records in 2+0 records out 8192 bytes (8.2 kB, 8.0 KiB)

我想要类似于
du
功能的代码。我通过使用
stat()
函数尝试了这一点。我已经了解了从
stat()报告的
st_块
是磁盘中分配的实际块号。块大小应为512字节,
st_blocks*512
应为文件分配的字节数。然而,我发现Cygwin环境令人困惑。首先,我使用
dd
命令创建一个8KB的文件

% dd if=/dev/urandom bs=4096 count=2 of=testfile
2+0 records in
2+0 records out
8192 bytes (8.2 kB, 8.0 KiB) copied, 0.00791222 s, 1.0 MB/s
然后我对文件运行
stat
命令:

% stat testfile
  File: testfile
  Size: 8192            Blocks: 8          IO Block: 65536  regular file
Device: 7727c30h/124943408d     Inode: 25614222880771065  Links: 1
Access: (0664/-rw-rw-r--)  Uid: (197881/ crystal)   Gid: (  513/    None)
Access: 2018-05-01 15:11:50.760626400 +0800
Modify: 2018-05-01 15:11:50.761626500 +0800
Change: 2018-05-01 15:11:50.761626500 +0800
 Birth: 2018-05-01 15:11:50.760626400 +0800
我认为生成的文件上没有“漏洞”。我得到分配了8个块的文件,这意味着块大小是1KB而不是512B。如果我使用
stat()
调用执行C代码,
st_blocks
会得到相同的结果


到目前为止,所有的文章都说块大小是512B。有例外吗?如果是,如何获得实际的块大小?或者,如何获取文件占用的实际磁盘空间?

命令行工具有一个
%B
格式选项,显示它使用的块大小。似乎
stat
在Cygwin中使用了一个1024字节的块

此外,似乎NTFS 4096字节块大小实际上是在引擎盖下使用的,并且
stat
仅显示1024字节块:

$ dd if=/dev/urandom of=foo count=1 bs=4095
$ stat -c '%B %b' foo
1024 4
$ dd if=/dev/urandom of=foo count=1 bs=4097
$ stat -c '%B %b' foo
1024 8

这里讨论了512字节与1024字节块大小的来源。显然,这与Linux内核约定与GNU实用程序约定有关。

谢谢。是否存在可以获得块大小为
stat%B
的系统调用?我不认为存在系统调用-这不是真正的内核问题。根据StackExchange文章,该大小在GNULIB头中设置。