Блокировка информации об устройстве без монтажа (в linux)

Я пытаюсь получить некоторую информацию (в частности, размер блока) блочного устройства в Linux, в C++. Можно ли получить размер блока устройства, не монтируя его и, возможно, не просматривая динамические файлы (например, в /sys), но только с помощью системного вызова.

Я пытался с stat, но возвращает данные о /dev файловая система, если я спрашиваю о /dev/sdb2,

Если это невозможно с помощью системного вызова, где я должен искать в динамических файлах (не смог найти его тоже.)

2 ответа

Решение

Вы хотите использовать 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);
Другие вопросы по тегам