2011-12-07 53 views
5

Tôi đang cố gắng lấy một số thông tin (cụ thể là kích thước khối) của thiết bị khối trong linux, bằng C++. Có thể nhận được kích thước khối của một thiết bị mà không cần gắn nó và có thể không nhìn vào các tệp động (như các tệp trong số /sys), mà chỉ với một cuộc gọi hệ thống.Chặn thông tin thiết bị mà không cần gắn (trong linux)

Tôi đã thử với stat, nhưng nó trả về dữ liệu về /dev hệ thống tệp nếu tôi hỏi về /dev/sdb2.

Nếu nó không thể với cuộc gọi hệ thống, nơi mà tôi nên tìm kiếm trong các tập tin năng động (đã không thể xác định vị trí nó, hoặc.)

Trả lời

9

Bạn muốn sử dụng ioctl, đặc biệt BLKSSZGET.

Trích dẫn linux/fs.h:

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

chưa được kiểm tra ví dụ:

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

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

Có vẻ như hoạt động .. –

+0

oh, có thể somebosy đề xuất, tại sao tôi nhận được số không? – Tebe

+1

@shbk - là blockSize zero hoặc rc? Cả hai đều bằng không sẽ đáng ngạc nhiên. – themel

0

Tôi nghĩ rằng giá trị ioctl khá nên unsigned long hơn size_t (mới nhất là nhiều bộ nhớ liên quan), tôi sẽ cũng khởi tạo nó thành 0 (chỉ trong trường hợp BLKSSZGET trả lại unsigned int thay thế).

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

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

Chúng là size_t trong 'fs.h', fwiw:' #define BLKBSZGET _IOR (0x12,112, size_t) 'và' #define BLKBSZSET _IOW (0x12,113, size_t) '. –

Các vấn đề liên quan