Как 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 .

Что «неправильно» с моим подходом? Как вычислить общее количество?

Редактировать:

Для проверки я создал папку, содержащую файлы 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 

  • Список всех флагов файла?
  • Команда ls: как игнорировать регистр без globbing
  • Список файлов, которые не начинаются с определенного префикса
  • ls -l номеров между размером и группой
  • «/ Usr / bin / ping» отображается как желтый на красном в цветовой схеме Fedora по умолчанию - что это значит?
  • Какой может быть вариант изменения измененного времени файла в будущем?
  • BASH: как Grep и отображает набор значений
  • Список файлов, которые соответствуют шаблону, но игнорируют файлы, соответствующие другому шаблону?
  • One Solution collect form web for “Как Linux вычисляет общее количество блоков при запуске / bin / ls -l?”

    По умолчанию ls для Linux представляет общую строку в 1K блоках, поэтому ваш результат правильный, так как вы считаете 512-байтные блоки.

    Вы можете заставить ls рассчитывать в 512-байтовых блоках с помощью POSIXLY_CORRECT :

     POSIXLY_CORRECT=1 ls -l 
    Interesting Posts

    Systemd: как запустить службу systemd после полной связи сети?

    Как я могу использовать Unstable repositories и устанавливать только пакеты в Testing по умолчанию (через AptConf)?

    Установка HP DeskJet 3520 в CUPS

    Файл журнала хвоста на нескольких машинах по ssh

    Автоматическое расширение последнего раздела для использования всего нераспределенного пространства, используя разделенный в пакетном режиме

    Найдите номер строки, который содержит шаблон, используя специальный разделитель регулярных выражений

    Как создать таблицу в awk?

    Выполнение команды «ip netns exec» с использованием nsid, полученного из «ip netns list-id»

    Actkbd как услуга с systemd

    config fstab-файл для корневых каталогов разломов

    Может ли sshd ограничить конечные точки клиентского туннеля на localhost?

    Default-Start не содержит уровней запуска

    Как использовать команду cd в команде su?

    Разница между xattr и chattr

    yum case (in) чувствительный

    Linux и Unix - лучшая ОС в мире.