Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/141.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用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 - Fatal编程技术网

使用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/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的以下内容进行了说明:

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
是物理磁盘块大小吗?如果是的话,那么这是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