7

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

#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是逻辑还是物理磁盘块大小。

那么,是st_blksize物理磁盘块大小,如果是,那么这是检测物理磁盘块大小的最 POSIX OS 可移植方式。

4

1 回答 1

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).

于 2013-04-11T11:38:04.223 回答