Como o Linux calcula a contagem total de blocos ao executar /bin/ls -l?

Como o Linux calcula a contagem total de blocos ao executar /bin/ls -l?

Estou tentando descobrir como o programa /bin/ls -lcalcula o tamanho total (contagem de blocos) de um diretório. Com isso quero dizer a saída que ele imprime logo antes do conteúdo do diretório.total number

Há uma pergunta semelhante aqui:https://stackoverflow.com/questions/7401704/what-is-that-total-in-the-very-first-line-after-ls-lmas não responde totalmente à pergunta nem explica exatamente como é calculado.

Eu tentei adicionar onúmeros de blocos de 512B alocados para todos os arquivos (não ocultos) em um diretório. Aqui está como estou tentando fazer isso (em 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;
}

No entanto, isso está me dando um número muito diferente em comparação com o lscomando.

O que há de “errado” na minha abordagem? Como lscalcula o total?

Editar:

Para testar fiz uma pasta que contém arquivos test_file1.txte test_file2.txtcada um contendo o texto Hello World!. Quando executo ls -lrecebo a seguinte saída

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

No entanto, quando executo meu código usando o método acima, recebo

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 

Responder1

No Ubuntu, o padrão lséGNUls, qualo padrão é tamanho de bloco de 1024 bytespara sua linha “total”. Isso explica a diferença na saída entre lse sua abordagem: sua abordagem mostra o dobro do número de blocos porque conta blocos de 512 bytes.

Existem várias maneiras de forçar o GNU lsa contar em blocos de 512 bytes (veja o link acima); o mais confiável é definir LS_BLOCK_SIZE:

LS_BLOCK_SIZE=512 ls -l

A outra implementação lsque você pode encontrar no Linux éOcupadoBox ls; ele também usa um tamanho de bloco de 1.024 bytes para a linha “total” e não pode ser configurado para usar qualquer outro tamanho.

informação relacionada