Linux は /bin/ls -l を実行するときに合計ブロック数をどのように計算しますか?

Linux は /bin/ls -l を実行するときに合計ブロック数をどのように計算しますか?

プログラムが/bin/ls -lディレクトリの合計サイズ (ブロック数) を計算する方法を理解しようとしています。これは、ディレクトリの内容の直前に出力される出力を意味します。total number

ここに同様の質問があります:https://stackoverflow.com/questions/7401704/what-is-that-total-in-the-very-first-line-after-ls-lしかし、質問に完全に答えているわけではなく、それがどのように計算されるのか正確に説明されていません。

私は追加してみました割り当てられた512Bブロックの数 ディレクトリ内のすべての(隠しファイルではない)ファイルに対して、私がこれを実行しようとしている方法は次のとおりです(C の場合):

 int getBlockSize(char* directory) {
   int size = 0;

   DIR *d;
   struct dirent *dir;
   struct stat fileStat;
   d = opendir(directory);
   if (d) {
       while ((dir = readdir(d)) != NULL) {
           if (dir->d_name[0] != '.') { // Ignore hidden files
               // Create the path to stat
               char info_path[PATH_MAX + 1];
               strcpy(info_path, directory);
               if (directory[strlen(directory) - 1] != '/')
                   strcat(info_path, "/");
               strcat(info_path, dir->d_name);

               stat(info_path, &fileStat);

               size += fileStat.st_blocks;
           }
       }
   }

   return size;
}

しかし、これはコマンドと比べてかなり異なる数値を示していますls

私のアプローチの何が「間違っている」のでしょうか?ls合計はどのように計算されるのでしょうか?

編集:

テストのために、テキストを含むファイルtest_file1.txtを含むフォルダを作成しました。実行すると、次の出力が得られます。test_file2.txtHello World!ls -l

total 1
-rw-------. 1 aaa111 ugrad 13 Oct 27 13:17 test_file1.txt
-rw-------. 1 aaa111 ugrad 13 Oct 27 13:17 test_file2.txt

しかし、上記の方法でコードを実行すると、

total 2
-rw-------. 1 aaa111 ugrad 13 Oct 27 13:17 test_file1.txt
-rw-------. 1 aaa111 ugrad 13 Oct 27 13:17 test_file2.txt 

答え1

Ubuntuでは、デフォルトlsGNUls、 どれのデフォルトでは1024バイトのブロックサイズになります「total」行に表示されます。これによりls、とあなたのアプローチの出力の違いが説明されます。あなたのアプローチでは、512 バイトのブロックをカウントしているため、ブロック数が 2 倍表示されます。

GNU に 512 バイトのブロックでカウントさせる方法はいくつかありますls(上記のリンクを参照)。最も信頼性の高い方法は、次のように設定することですLS_BLOCK_SIZE

LS_BLOCK_SIZE=512 ls -l

lsLinuxで遭遇する可能性のある他の実装はビジーボックス ls; また、「合計」行には 1024 バイトのブロック サイズが使用され、他のサイズを使用するように構成することはできません。

関連情報