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.txttest_file2.txt各ファイルにはテキストが含まれていますHello 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のデフォルト値lsは次のとおりです。牛に似た一種の栄養ls、どちらデフォルトは1024バイトのブロックサイズです。「全体」ラインです。これはあなたの方法とあなたの方法の間の出力の違いを説明しますls。あなたの方法は512バイトのブロックを計算するので、ブロック数は2倍になります。

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

LS_BLOCK_SIZE=512 ls -l

lsLinuxで利用可能なもう1つの実装は次のとおりです。忙しい箱 ls;また、「フル」行には1024バイトのブロックサイズを使用し、他のサイズを使用するように設定することはできません。

関連情報