Linuxのファイルブロックサイズはいくらですか?

Linuxのファイルブロックサイズはいくらですか?

統計構造を使用して両方のファイルのファイルブロックサイズを取得したいと思います。

インターネットでは、ファイルブロックサイズが使用されるデバイスの影響を受けると言われています。

これが正しい場合、同じパーティション内のすべてのファイルのブロックサイズは同じですか?

blockcmp関数を使用していますが、常に同じサイズを返します。これが正しいか、私が何かを見逃しているものがあるかどうか疑問に思います。

ここに私のコードがあります。

#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")
    }
}

`

答え1

st_blksize返されるフィールドには、stat()「効率的なファイルシステムI / Oに好ましいブロックサイズ」があります。 (statマンページから)。この値は、効率的なI / Oのためにこのサイズの倍数でファイルにデータを読み書きする必要があるというヒントとして解釈されるべきです。おっしゃるとおり、ストレージデバイスによって異なり、ファイルシステムによって異なります。ハードウェアデバイスの論理ブロックサイズよりも大きくなることがありますが、通常はCPUメモリページサイズによって制限されます。論理ブロックサイズは通常、ハードディスクの場合は512または4096バイト、光メディアの場合は2048バイトです。

ただし、コードはst_blocksstructフィールドを使用しますstat。このフィールドは、ファイルが占める512バイトブロックの数を示します。私はあなたがst_blksizeプログラムでこのフィールドを使用したいと思います。

関連情報