Como determinar o valor da transferência de dados do dispositivo

1

Existe uma maneira de determinar a quantidade de dados transferidos de / para um dispositivo. Não estou perguntando sobre o tamanho do bloco ou setor. Eu quero saber o valor transferido por uma operação de leitura / gravação.

Por exemplo, se eu quiser transferir um bloco de 0x200 bytes:

blocks = fread ((void *) & Block, 0x200, 1, FILE * fp);

o que acontece se eu chegar ao final do arquivo e somente um bloco parcial for lido e como determino a contagem real de bytes.

Eu percebo que posso fazer o oposto, como em:

bytes = fread ((void *) & Block, 1, 0x200, FILE * fp);

mas e se eu quiser ler vários blocos ???

Existe uma função do kernel como ioctl (dev, FNUM) que retornará a contagem real de bytes?

Muito obrigado, CB

    
por Cpmb 28.08.2014 / 19:26

1 resposta

0

Como você percebeu, você pode usar um parâmetro de tamanho de 1 byte e o número de itens como 0x200.

bytes = fread((void*)&Block, 1, 0x200, fp);

Em seguida, o fread retornará o número de itens (número de bytes) na verdade de leitura.

Normalmente, o fread seria colocado em um loop para ler todos os blocos. Como alternativa (dependendo de suas necessidades reais) fstat ou stat chamadas do sistema podem ser usadas para obter o tamanho do arquivo antes de lê-lo.

Na página fread man, a contagem curta de objetos referenciada significa, por exemplo, se houver 0x201 bytes no arquivo que está sendo lido, a primeira leitura retornará 0x200, a segunda leitura retornará 1.

RETURN VALUES

 The functions fread() and fwrite() advance the file position indicator for
 the stream by the number of bytes read or written.  They return the number
 of objects read or written.  If an error occurs, or the end-of-file is
 reached, the return value is a short object count (or zero).
    
por 28.08.2014 / 19:42