2013-04-11 15 views
5

pracuję nad programem I/O wysokiej wydajności i próbuję znaleźć najlepszy sposób, aby określić fizyczne (a nie logiczną) bajt rozmiar bloków dysków urządzenia z C++. Moje badania dotychczas doprowadziło mnie do poniższym fragmencie kodu:fizyczny rozmiar bloku na dysku POSIX za pomocą 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; 
} 

Strony man mówi po około st_blksize:

Pole st_blksize daje „preferowany” rozmiar bloku dla efektywnego systemu pliku I/O. (Zapis do pliku mniejszych kawałków może spowodować nieefektywne odczytu modyfikować-rewrite).

, ale nie wspomina, czy st_blksize jest logiczny lub fizyczny rozmiar bloku na dysku.

Więc, jest st_blksize fizyczny rozmiar bloku dysku, a jeśli tak, to jest to najbardziej przenośny sposób wykrywania POSIX OS fizycznego rozmiaru bloku dysku.

+3

Nie sądzę, że jest to możliwe za pośrednictwem POSIX. –

+0

Zastanawiam się, czym jest 'st_blksize' dla'/dev/null'. I zastanawiam się, czy byłby to rozmiar * fizyczny *, czy * logiczny *. –

+0

@DanMoulding '/ dev/null' jest urządzeniem znakowym, a nie urządzeniem blokowym. – Petesh

Odpowiedz

5

Napisałem odpowiedź, że podczas gdy nadzieja nie działa poprawnie dla urządzeń blokowych.

Nie istnieje żaden mechanizm POSIX do uzyskania podstawowego fizycznego rozmiaru bloku urządzenia, musisz odwołać się do ioctl, który jest zależny od platformy.

dla Linuksa istnieje ioctl(fd, BLKPBSZGET, &block_size)

Dla Solaris istnieje interfejs dkio, który pozwala uzyskać fizyczny rozmiar bloku.

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

W systemie Mac OS X numer to ioctl(fd, DKIOCGETPHYSICALBLOCKSIZE, &block_size).

Dla FreeBSD powinno być iotcl(fd, DIOCGSECTORSIZE, &block_size).

+0

Co z 'ioctl (fd, FIGETBSZ i rozmiar bloku)'? Czy 'FIGETBSZ' również blokuje _physical_? –

+0

@IngeHenriksen Nie, jest to wielkość bloków dla systemu plików pod względem strategii przydzielania bloków systemu plików – Petesh

+0

A w systemie Windows GetDiskFreeSpaceEx() :) –