2011-12-07 16 views
5

मैं सी ++ में लिनक्स में ब्लॉक डिवाइस की कुछ जानकारी (विशेष रूप से ब्लॉक आकार) प्राप्त करने की कोशिश कर रहा हूं। क्या किसी डिवाइस के ब्लॉक आकार को संभवतः गतिशील फ़ाइलों (जैसे /sys में) के बिना किसी डिवाइस के ब्लॉक आकार प्राप्त करना संभव है, लेकिन केवल सिस्टम कॉल के साथ।माउंटिंग के बिना डिवाइस डिवाइस की जानकारी (लिनक्स में)

मैं stat के साथ प्रयास कर रहा था, लेकिन अगर मैं /dev/sdb2 के बारे में पूछता हूं तो यह /dev फाइल सिस्टम के बारे में डेटा देता है।

यदि यह प्रणाली अधिकार, जहां मैं गतिशील फाइलों में दिखना चाहिए के साथ असंभव है (यह या तो लगाने में सक्षम नहीं किया गया है।)

उत्तर

9

आप विशेष BLKSSZGET में ioctl उपयोग करने के लिए, चाहते हैं।

का हवाला देते हुए linux/fs.h:

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

untested है उदाहरण:

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

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

काम करने लगता है .. –

+0

ओह, कुछ सुझाव दे सकते हैं, मुझे शून्य क्यों मिल रहा है? – Tebe

+1

@shbk - ब्लॉक शून्य या आरसी आकार है? शून्य होने पर दोनों आश्चर्यचकित होंगे। – themel

0

मुझे लगता है कि ioctl मूल्य बल्कि size_t से unsigned long (नवीनतम अधिक स्मृति से संबंधित है) होना चाहिए, मैं करूंगा इसे 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); 
+0

वे आकार_टी 'fs.h' में हैं, fwiw:' # BLFBSZGET _IOR (0x12,112, size_t) परिभाषित करें और '# परिभाषित करें BLKBSZSET _IOW (0x12,113, size_t)'। –

संबंधित मुद्दे