Блокировка информации об устройстве без монтирования в Linux - PullRequest
5 голосов
/ 07 декабря 2011

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

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

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

Ответы [ 2 ]

9 голосов
/ 07 декабря 2011

Вы хотите использовать 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);
0 голосов
/ 22 января 2014

Я думаю, что значение 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);
...