2011-12-07 14 views
5

Estoy tratando de obtener cierta información (específicamente el tamaño del bloque) del dispositivo de bloque en Linux, en C++. ¿Es posible obtener el tamaño de bloque de un dispositivo sin montarlo y, posiblemente, sin mirar archivos dinámicos (como los de /sys), pero solo con una llamada al sistema?Información del dispositivo de bloque sin montar (en Linux)

Lo estaba intentando con stat, pero devuelve datos sobre el sistema de archivos /dev si pregunto acerca de /dev/sdb2.

Si es imposible con la llamada al sistema, donde debo buscar en archivos dinámicos (no han podido localizar tampoco.)

Respuesta

9

Desea utilizar ioctl, en particular, BLKSSZGET.

Citando Linux/fs.h:

#define BLKSSZGET _IO(0x12,104)/* get block device sector size */ 

ejemplo no probado:

#include <sys/ioctl.h> 
#include <linux/fs.h> 

int fd = open("/dev/sda"); 
size_t blockSize; 
int rc = ioctl(fd, BLKSSZGET, &blockSize); 
+0

Parece que funciona .. –

+0

oh, ¿podría algúnbosy sugerir, por qué estoy obteniendo un cero? – Tebe

+1

@shbk - ¿es blockSize cero o rc? Ambos siendo cero serían sorprendentes. – themel

0

Creo que el valor ioctl debería ser más bien unsigned long que size_t (la última es más memoria relacionada), lo haría también inícielo a 0 (solo en caso de que BLKSSZGET devuelva 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); 
+0

Son size_t en 'fs.h', fwiw:' #define BLKBSZGET _IOR (0x12,112, size_t) 'y' #define BLKBSZSET _IOW (0x12,113, size_t) '. –

Cuestiones relacionadas