2013-04-11 11 views
5

मैं एक उच्च प्रदर्शन आई/ओ कार्यक्रम पर काम कर रहा हूँ और मैं शारीरिक (और नहीं तार्किक) बाइट निर्धारित करने के लिए सबसे अच्छा तरीका खोजने की कोशिश कर रहा हूँ सी ++ के साथ डिवाइस के डिस्क ब्लॉक का आकार। मेरे शोध अब तक निम्नलिखित कोड का टुकड़ा करने के लिए मुझे प्रेरित किया है:शारीरिक डिस्क ब्लॉक आकार का उपयोग C/C++

#include <iostream> 
#include <sys/stat.h> 
#include <stdio.h> 
#include <errno.h> 

int main(int argc, char ** argv) 
{ 
// file information including block size of the device 
struct stat info; 
// device to get block size from 
char * device = "/mnt/hdb1"; 

if (stat(device, &info)) 
{ 
printf("stat() error"); 
strerror(errno); 
exit(1); 
} 
printf("Prefered block size for '%s' is %i byte\n", device, info.st_blksize); 
return 0; 
} 

आदमी पृष्ठों का कहना है निम्नलिखित के बारे में st_blksize:

st_blksize क्षेत्र कुशल फाइल सिस्टम के लिए "पसंदीदा" ब्लॉकसाइज देता रहा/हे। (छोटे मात्रा में एक फाइल करने के लिए लेखन एक अक्षम पढ़ने के लिए संशोधित-पुनर्लेखन हो सकती है।)

, लेकिन अगर st_blksize तार्किक या भौतिक डिस्क ब्लॉक आकार है यह उल्लेख नहीं है।

तो, st_blksizeशारीरिक डिस्क ब्लॉक आकार है, और अगर ऐसा है, तो यह सबसे POSIX ओएस भौतिक डिस्क ब्लॉक आकार का पता लगाने में पोर्टेबल तरीका है।

+3

मुझे नहीं लगता कि यह पॉज़िक्स के माध्यम से संभव है। –

+0

मुझे आश्चर्य है कि 'st_blksize'' dev/null' के लिए क्या है। और मुझे आश्चर्य है कि यह * भौतिक * आकार या * तार्किक * आकार होगा। –

+0

@DanMoulding '/ dev/null' एक वर्ण डिवाइस है, न कि ब्लॉक डिवाइस। – Petesh

उत्तर

5

मैंने एक उत्तर लिखा, जबकि उम्मीदवार ब्लॉक उपकरणों के लिए सही ढंग से काम नहीं करते थे।

किसी डिवाइस के मौलिक भौतिक ब्लॉक आकार को प्राप्त करने के लिए कोई पॉज़िक्स तंत्र नहीं है, तो आपको ioctl का सहारा लेना होगा, जो मंच निर्भर है।

लिनक्स के लिए वहाँ वहाँ dkio इंटरफ़ेस है, जो आप शारीरिक ब्लॉक आकार पाने के लिए अनुमति देता है सोलारिस के लिए ioctl(fd, BLKPBSZGET, &block_size)

है।

dk_minfo_ext media_info; 
if (-1 != ioctl(fd, DKIOMEDIAINFOEXT, &media_info)) 
    block_size = media_info.dki_pbsize; 

मैक ओएस एक्स के लिए, यह ioctl(fd, DKIOCGETPHYSICALBLOCKSIZE, &block_size) है।

फ्रीबीएसडी के लिए, यह iotcl(fd, DIOCGSECTORSIZE, &block_size) होना चाहिए।

+0

'ioctl (fd, FIGETBSZ, और block_size) 'के बारे में क्या? क्या 'FIGETBSZ' _physical_ अवरोध भी है? –

+0

@IngeHenriksen Nope, यह फ़ाइल सिस्टम के ब्लॉक आवंटन रणनीति – Petesh

+0

और Windows GetDiskFreeSpaceEx() पर –

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