【发布时间】:2012-01-15 00:27:17
【问题描述】:
我正在尝试在 C++ 中获取 linux 中块设备的一些信息(特别是块大小)。是否可以在不安装设备并且可能不查看动态文件(如/sys 中的文件)的情况下获取设备的块大小,但仅使用系统调用。
我尝试使用stat,但如果我询问/dev/sdb2,它会返回有关/dev 文件系统的数据。
如果系统调用不可能,我应该在哪里查看动态文件(也无法找到它。)
【问题讨论】:
标签: linux block-device
我正在尝试在 C++ 中获取 linux 中块设备的一些信息(特别是块大小)。是否可以在不安装设备并且可能不查看动态文件(如/sys 中的文件)的情况下获取设备的块大小,但仅使用系统调用。
我尝试使用stat,但如果我询问/dev/sdb2,它会返回有关/dev 文件系统的数据。
如果系统调用不可能,我应该在哪里查看动态文件(也无法找到它。)
【问题讨论】:
标签: linux block-device
您想使用ioctl,尤其是BLKSSZGET。
引用 linux/fs.h:
#define BLKSSZGET _IO(0x12,104)/* get block device sector size */
未经测试的例子:
#include <sys/ioctl.h>
#include <linux/fs.h>
int fd = open("/dev/sda");
size_t blockSize;
int rc = ioctl(fd, BLKSSZGET, &blockSize);
【讨论】:
我认为ioctl 的值应该是unsigned long 而不是size_t(最新的是更多的内存相关),我还将它初始化为0(以防BLKSSZGET 返回unsigned int)。
#include <sys/ioctl.h>
#include <linux/fs.h>
int fd = open("/dev/sda");
unsigned long blockSize = 0;
int rc = ioctl(fd, BLKSSZGET, &blockSize);
【讨论】:
fs.h 中的size_t,fwiw:#define BLKBSZGET _IOR(0x12,112,size_t) 和#define BLKBSZSET _IOW(0x12,113,size_t)。