O que é tamanho de bloco de arquivo no Linux?

0

Eu quero obter o tamanho do bloco de arquivos de dois arquivos, usando struct stat.

Na internet, eles dizem que o tamanho do bloco de arquivo é afetado pelo dispositivo usado.

Se isso é certo, o tamanho do bloco de todos os arquivos na mesma partição é igual?

Estou usando a função blockcmp, sempre retorna o mesmo tamanho. Eu me pergunto se está certo ou se eu sinto falta de algo.

Aqui está o meu código.

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <time.h>


struct stat stat1, stat2;
struct tm *time1, *time2;

void filestat1(void);
void filestat2(void);
void filetime1(void);
void filetime2(void);
void sizecmp(void);
void blockcmp(void);
void datecmp(void);
void timecmp(void);

int main(void)
{
    filestat1();
    filestat2();
    filetime1();
    filetime2();
    sizecmp();
    blockcmp();
    datecmp();
    timecmp();
}

void filestat1(void)
{
    // check if there is no text1
    int check = 0;
    check = stat("text1", &stat1);

    if(check != 0)
    {
        printf("Error : there is no text1\n");
    }
    return;
}

void filestat2(void)
{
    // check if there is no text2
    int check = 0;
    check = stat("text2", &stat2);

    if(check != 0)
    {
        printf("Error : there is no text2\n");
    }
    return;
}

void filetime1(void)
{
    time1 = localtime(&stat1.st_mtime);
    return;
}

void filetime2(void)
{
    time2 = localtime(&stat2.st_mtime);
    return;
}


void sizecmp(void)
{
    printf("size compare\n");
    //variable declare
    long long int text1_size;
    long long int text2_size;

    //variable initialize
    text1_size = stat1.st_size;
    text2_size = stat2.st_size;
    if(text1_size > text2_size)
        printf("text1 is bigger\n");
    else if(text1_size < text2_size)
        printf("text2 is bigger\n");
    else
        printf("same size\n");

    printf("\n");
    return;
}

void blockcmp(void)
{
    printf("block compare\n");
    //variable declare
    long long int text1_block_size;
    long long int text2_block_size;
    //variable initialize
    text1_block_size = stat1.st_blocks;
    text2_block_size = stat2.st_blocks;

    if(text1_block_size > text2_block_size)
        printf("text1 is bigger\n");
    else if(text1_block_size < text2_block_size)
        printf("text2 is bigger\n");
    else
        printf("same size\n");

    printf("\n");
    return;
}

void datecmp(void)
{
    printf("date compare\n");
    // compare tm_mon
    if(time1->tm_mon > time2->tm_mon)
        printf("time1 is early \n");
    else if(time1->tm_mon < time2->tm_mon)
        printf("time2 is early \n");
    else{
        // compare tm_mday
        if(time1->tm_mday > time2->tm_mday)
            printf("time1 is early \n");
        else if(time1->tm_mday < time2->tm_mday)
            printf("time2 is early \n");
        // same date
        else
            printf("same time \n");
    }
    printf("\n");
}

void timecmp(void)
{
    printf("time compare\n");
    // compare hour
    if(time1->tm_hour > time2->tm_hour)
        printf("time1 is early \n");
    else if(time1->tm_hour < time2->tm_hour)
        printf("time2 is early \n");
    else{
        // compare minutes
        if(time1->tm_min > time2->tm_min)
            printf("time1 is early \n");
        else if(time1->tm_min < time2->tm_min)
            printf("time2 is early \n");
        // same time
        ;else
            printf("same time \n")
    }
}

'

    
por Aiden 26.04.2018 / 18:10

1 resposta

4

O campo st_blksize retornado por stat() fornece o "tamanho de bloco preferido para E / S de sistema de arquivos eficiente". (da página stat man). O valor deve ser interpretado como uma sugestão de que você deve ler e gravar dados em arquivos em múltiplos desse tamanho para uma E / S eficiente. É, como você diz, dependente do dispositivo de armazenamento e também pode depender do sistema de arquivos. Pode ser maior que o tamanho de bloco lógico do dispositivo de hardware, mas é tipicamente limitado pelo tamanho da página de memória da CPU. O tamanho do bloco lógico é normalmente de 512 ou 4096 bytes em discos rígidos e 2048 bytes em mídia ótica.

A propósito, seu código usa o campo st_blocks da estrutura stat . Este campo informa quantos blocos de 512 bytes o arquivo ocupa. Eu acho que você queria usar o campo st_blksize em seu programa.

    
por 26.04.2018 / 19:12

Tags