用C / C上POSIX物理磁盘块大小++(Physical disk block size on

2019-08-21 17:42发布

我工作的高性能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是逻辑或物理磁盘块大小。

所以,是st_blksize 物理盘块大小,以及如果是的话,则是检测物理盘块大小此最POSIX OS可移植的方法。

Answer 1:

我写了一个答案,虽然希望没有块设备的正常工作。

没有为获得设备的基本物理块大小没有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)



文章来源: Physical disk block size on POSIX using C/C++