Как Linux подсчитывает общее количество блоков при запуске /bin/ls -l?

Как Linux подсчитывает общее количество блоков при запуске /bin/ls -l?

Я пытаюсь понять, как программа /bin/ls -lвычисляет общий размер (количество блоков) для каталога. Под этим я подразумеваю вывод, который она печатает прямо перед содержимым каталога.total number

Похожий вопрос есть и здесь:https://stackoverflow.com/questions/7401704/что-это-всего-в-первой-строке-после-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.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 байт.

Существуют различные способы заставить GNU lsвести подсчет блоками по 512 байт (см. ссылку выше); наиболее надежный — установить LS_BLOCK_SIZE:

LS_BLOCK_SIZE=512 ls -l

Другая реализация, с lsкоторой вы, вероятно, столкнетесь в Linux, — этоBusyBox ls; он также использует размер блока 1024 байта для строки «total», и его нельзя настроить на использование какого-либо другого размера.

Связанный контент