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

1

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

Há uma pergunta semelhante aqui: link , mas não responde totalmente à pergunta nem explica exatamente como ela é calculada.

Eu tentei adicionar os números de blocos de 512B para todos os arquivos (não ocultos) em um diretório. Aqui está como eu 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 relação ao comando ls .

O que está "errado" com minha abordagem? Como ls calcula o total?

Editar:

Para testar, criei uma pasta que contém os arquivos test_file1.txt e test_file2.txt , cada um contendo o texto Hello World! . Quando eu executo ls -l , recebo 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, obtenho

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 
    
por wKavey 27.10.2016 / 17:59

1 resposta

0

O padrão ls no Linux é apresentar a linha total em blocos de 1K, então seu resultado está correto, já que você está contando blocos de 512 bytes.

Você pode forçar o ls a contar em blocos de 512 bytes usando POSIXLY_CORRECT :

POSIXLY_CORRECT=1 ls -l
    
por 31.10.2016 / 17:41