¿Cómo calcula Linux el recuento total de bloques cuando ejecuta /bin/ls -l?

¿Cómo calcula Linux el recuento total de bloques cuando ejecuta /bin/ls -l?

Estoy tratando de descubrir cómo el programa /bin/ls -lcalcula el tamaño total (recuento de bloques) de un directorio. Con esto me refiero a la salida que imprime justo antes del contenido del directorio.total number

Hay una pregunta similar aquí:https://stackoverflow.com/questions/7401704/what-is-that-total-in-the-very-first-line-after-ls-lpero no responde completamente a la pregunta ni explica exactamente cómo se calcula.

Intenté agregar elnúmeros de bloques 512B asignados para todos los archivos (no ocultos) en un directorio. Así es como intento hacerlo (en 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;
}

Sin embargo, esto me da un número muy diferente en comparación con el lscomando.

¿Qué hay de malo en mi enfoque? ¿Cómo se lscalcula el total?

Editar:

Para probar, hice una carpeta que contiene archivos test_file1.txty test_file2.txtcada uno contiene el texto Hello World!. Cuando lo ejecuto ls -lobtengo el siguiente resultado

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

Sin embargo, cuando ejecuto mi código usando el método anterior obtengo

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 

Respuesta1

En Ubuntu, el valor predeterminado lsesÑUls, cualpor defecto el tamaño de bloque es de 1024 bytespara su línea “total”. Esto explica la diferencia en el resultado entre lssu enfoque y su enfoque: su enfoque muestra el doble de bloques porque cuenta bloques de 512 bytes.

Hay varias formas de obligar a GNU lsa contar en bloques de 512 bytes (consulte el enlace de arriba); lo más confiable es configurar LS_BLOCK_SIZE:

LS_BLOCK_SIZE=512 ls -l

La otra implementación lsque probablemente encontrará en Linux esCaja ocupada ls; también utiliza un tamaño de bloque de 1024 bytes para la línea "total" y no se puede configurar para utilizar ningún otro tamaño.

información relacionada