2011-12-07 9 views
5

Próbuję uzyskać informacje (w szczególności rozmiar bloku) urządzenia blokowego w systemie Linux, w C++. Czy możliwe jest uzyskanie rozmiaru bloku urządzenia bez jego instalowania i ewentualnie bez zaglądania do plików dynamicznych (takich jak te w /sys), ale tylko z wywołaniem systemowym.Zablokuj informacje o urządzeniu bez montowania (w systemie Linux)

Próbowałem z stat, ale zwraca dane o systemie plików /dev, jeśli zapytam o /dev/sdb2.

Jeśli jest to niemożliwe z wywołania systemowego, gdzie należy szukać w plikach dynamicznych (nie udało się zlokalizować je albo.)

Odpowiedz

9

Chcesz użyć ioctl, w szczególności BLKSSZGET.

Cytowanie linux/fs.h:

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

Nietestowane przykład:

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

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

Wydaje się pracować .. –

+0

oh, może somebosy sugerują, dlaczego otrzymuję zero? – Tebe

+1

@shbk - czy blokuje zero lub rc? Oboje, którzy są zero, byliby zaskakujący. – themel

0

myślę wartość ioctl powinno być raczej unsigned long niż size_t (ostatni jest bardziej związane z pamięci), chciałbym również zainicjuj go na 0 (tylko w przypadku, gdy BLKSSZGET zamiast tego zwraca 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

Są one size_t w 'fs.h', fwiw:' #define BLKBSZGET _IOR (0x12,112, size_t) 'i' #define BLKBSZSET _IOW (0x12,113, size_t) '. –

Powiązane problemy