使用C / C ++在POSIX上的物理磁盘块大小

时间:2013-04-11 08:39:56

标签: c++ linux unix filesystems posix

我正在开发一个高性能I / O程序,我正在尝试找到确定物理(而不是逻辑)字节的最佳方法使用C ++的设备磁盘块的大小。到目前为止,我的研究使我得到以下代码片段:

#include <iostream>
#include <sys/stat.h>
#include <stdio.h>
#include <errno.h>

int main(int argc, char ** argv)
{
// file information including block size of the device
struct stat info;
// device to get block size from
char * device = "/mnt/hdb1";

if (stat(device, &info))
{
printf("stat() error");
strerror(errno);
exit(1);
}
printf("Prefered block size for '%s' is %i byte\n", device, info.st_blksize);
return 0;
}

手册页说明了以下关于st_blksize

的内容
  

st_blksize字段为高效提供“首选”块大小   文件系统I / O. (以较小的块写入文件可能会导致   低效的读 - 修改 - 重写。)

,但没有提及st_blksize是逻辑块还是物理磁盘块大小。

那么,{{1>}是物理磁盘块的大小,如果是这样,那么这是检测物理磁盘块大小的最便捷的POSIX OS可移植方式。

1 个答案:

答案 0 :(得分:5)

我写了一个答案,虽然有希望无法正常使用块设备。

没有用于获取设备基本物理块大小的POSIX机制,您将不得不求助于ioctl,这取决于平台。

对于linux,有ioctl(fd, BLKPBSZGET, &block_size)

对于Solaris,有dkio接口,允许您获取物理块大小。

dk_minfo_ext media_info;
if (-1 != ioctl(fd, DKIOMEDIAINFOEXT, &media_info))
    block_size = media_info.dki_pbsize;

对于Mac OS X,它是ioctl(fd, DKIOCGETPHYSICALBLOCKSIZE, &block_size)

对于FreeBSD,它应该是iotcl(fd, DIOCGSECTORSIZE, &block_size)