使用C/C++; 我正在研究一个高性能的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; } #包括 #包括 #包括 #包括 int main(int argc,字符**argv) { //文件信息,包括设备的块大小 结构统计信息; //从中获取块大小的设备 char*device=“/mnt/hdb1”; if(状态(设备和信息)) { printf(“stat()错误”); 斯特雷罗(埃尔诺); 出口(1); } printf(““%s”的首选块大小为%i字节\n”,设备,info.st_blksize); 返回0; }
手册页对st_blksize的以下内容进行了说明: st_blksize字段给出了“首选”块大小,以实现高效 文件系统I/O。(以较小的数据块写入文件可能会导致 低效的读修改重写。) ,但它没有提到使用C/C++; 我正在研究一个高性能的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; } #包括 #包括 #包括 #包括 int main(int argc,字符**argv) { //文件信息,包括设备的块大小 结构统计信息; //从中获取块大小的设备 char*device=“/mnt/hdb1”; if(状态(设备和信息)) { printf(“stat()错误”); 斯特雷罗(埃尔诺); 出口(1); } printf(““%s”的首选块大小为%i字节\n”,设备,info.st_blksize); 返回0; },c++,linux,unix,filesystems,posix,C++,Linux,Unix,Filesystems,Posix,手册页对st_blksize的以下内容进行了说明: st_blksize字段给出了“首选”块大小,以实现高效 文件系统I/O。(以较小的数据块写入文件可能会导致 低效的读修改重写。) ,但它没有提到st_blksize是逻辑磁盘块大小还是物理磁盘块大小 dk_minfo_ext media_info; if (-1 != ioctl(fd, DKIOMEDIAINFOEXT, &media_info)) block_size = media_info.dki_pbsize; 因
st_blksize
是逻辑磁盘块大小还是物理磁盘块大小
dk_minfo_ext media_info;
if (-1 != ioctl(fd, DKIOMEDIAINFOEXT, &media_info))
block_size = media_info.dki_pbsize;
因此,
st_blksize
是物理磁盘块大小吗?如果是的话,那么这是POSIX操作系统检测物理磁盘块大小的最便捷的方法。我写了一个答案,虽然hope不能正确地用于块设备
dk_minfo_ext media_info;
if (-1 != ioctl(fd, DKIOMEDIAINFOEXT, &media_info))
block_size = media_info.dki_pbsize;
没有POSIX机制来获取设备的基本物理块大小,您必须求助于平台相关的ioctl
对于linux,有
对于Solaris,有一个接口,它允许您获取物理块大小
dk_minfo_ext media_info;
if (-1 != ioctl(fd, DKIOMEDIAINFOEXT, &media_info))
block_size = media_info.dki_pbsize;
对于MacOSX来说,这是一个很好的选择
对于FreeBSD,应该是这样。我认为通过POSIX是不可能的。我想知道
st_-blksize
对于/dev/null
来说是什么。我想知道这是物理大小还是逻辑大小。@danmolding/dev/null
是字符设备,而不是块设备。@Petesh:你能告诉我在POSIX标准中这种区别是在哪里产生的吗?@danmolding应该在stat
st_mode
字段中。这就是POSIX必须说明的字符和块特殊设备之间的区别。ioctl(fd、FIGETBSZ和block_size)呢?FIGETBSZ
也是物理块大小吗?@IngeHenriksen不,它是文件系统的块分配策略方面的块大小,在Windows GetDiskFreeSpaceEx():)@CesarOrtiz上,您需要使用,它允许确定磁盘的块大小;其他闭塞装置;我不know@CesarOrtiz不,这将只获取Windows上的逻辑块大小,您需要使用DeviceIoControl()
:STORAGE\u PROPERTY\u QUERY storageQuery执行IOCTL\u查询属性
存储查询;storageQuery.PropertyId=StorageAccessAlignmentProperty;storageQuery.QueryType=PropertyStandardQuery;存储\访问\对齐\描述符diskAlignment={0};设备控制(hDrive、IOCTL\u STORAGE\u QUERY\u PROPERTY和storageQuery、sizeof(STORAGE\u PROPERTY\u QUERY)、diskAlignment、sizeof(STORAGE\u ACCESS\u ALIGNMENT\u DESCRIPTOR)和outsize,NULL);标准::cout