问题
I am trying to get some information (specifically block size) of block device in linux, in C++. Is it possible to get block size of a device without mounting it and possibly without looking into dynamic files (like the ones in /sys), but with a system call only.
I was trying with stat, but it returns data about /dev filesystem if I ask about /dev/sdb2.
If it's impossible with system call, where should i look in dynamic files (haven't been able to locate it either.)
回答1:
You want to use ioctl, in particular BLKSSZGET.
Quoting linux/fs.h:
#define BLKSSZGET _IO(0x12,104)/* get block device sector size */
Untested example:
#include <sys/ioctl.h>
#include <linux/fs.h>
int fd = open("/dev/sda");
size_t blockSize;
int rc = ioctl(fd, BLKSSZGET, &blockSize);
回答2:
I think the ioctl value should rather be unsigned long than size_t (the latest is more memory related), I would also initialize it to 0 (just in case BLKSSZGET returns unsigned int instead).
#include <sys/ioctl.h>
#include <linux/fs.h>
int fd = open("/dev/sda");
unsigned long blockSize = 0;
int rc = ioctl(fd, BLKSSZGET, &blockSize);
来源:https://stackoverflow.com/questions/8416241/block-device-information-without-mounting-in-linux