2013-04-11 6 views
5

Sto lavorando su un programma di I/O ad alte prestazioni e sto cercando di trovare il modo migliore per determinare il fisico (non la logica e ) Byte dimensione dei blocchi del disco di un dispositivo con C++. La mia ricerca finora mi ha portato al seguente frammento di codice:dimensione fisica del blocco del disco su POSIX tramite 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; 
} 

Le pagine uomo dice quanto segue riguardo st_blksize:

Il campo st_blksize dà la dimensione del blocco "preferito" per un efficiente file system I/O. (Scrittura di un file in blocchi più piccoli può causare un inefficiente lettura-modifica-riscrittura.)

, ma non parlare se st_blksize è la logica o la dimensione del blocco del disco fisico.

Quindi, è st_blksize il fisico dimensioni del blocco del disco, e se è così, allora questo è il modo più POS portatile OS di rilevare la dimensione del blocco del disco fisico.

+3

Non penso sia possibile tramite POSIX. –

+0

Mi chiedo cosa 'st_blksize' sia per'/dev/null'. E mi chiedo se sarebbe la dimensione * fisica * o quella * logica *. –

+0

@DanMoulding '/ dev/null' è un dispositivo di carattere, non un dispositivo a blocchi. – Petesh

risposta

5

Ho scritto una risposta, che mentre speranzoso non ha funzionato correttamente per i dispositivi a blocchi.

Non esiste alcun meccanismo POSIX per ottenere la dimensione fisica di blocco fondamentale di un dispositivo, sarà necessario ricorrere a ioctl, che dipende dalla piattaforma.

For linux c'è ioctl(fd, BLKPBSZGET, &block_size)

Per Solaris c'è l'interfaccia dkio, che consente di ottenere la dimensione del blocco fisico.

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

Per Mac OS X, è ioctl(fd, DKIOCGETPHYSICALBLOCKSIZE, &block_size).

Per FreeBSD, deve essere iotcl(fd, DIOCGSECTORSIZE, &block_size).

+0

Che dire di 'ioctl (fd, FIGETBSZ, & block_size)'? È 'FIGETBSZ' anche il _physical_ blocksize? –

+0

@IngeHenriksen No, è la dimensione dei blocchi per un file system in termini di strategia di allocazione dei blocchi del file system – Petesh

+0

E su Windows GetDiskFreeSpaceEx() :) –

Problemi correlati