Wie berechnet Linux die Gesamtblockanzahl beim Ausführen von /bin/ls -l?

Wie berechnet Linux die Gesamtblockanzahl beim Ausführen von /bin/ls -l?

Ich versuche herauszufinden, wie das Programm /bin/ls -ldie Gesamtgröße (Blockanzahl) eines Verzeichnisses berechnet. Damit meine ich die Ausgabe, die es direkt vor dem Verzeichnisinhalt ausgibt.total number

Eine ähnliche Frage gibt es hier:https://stackoverflow.com/questions/7401704/was-ist-das-insgesamt-in-der-allerersten-zeile-nach-ls-lEs beantwortet die Frage jedoch nicht vollständig und erklärt auch nicht genau, wie es berechnet wird.

Ich habe versucht, dieAnzahl der zugewiesenen 512B-Blöcke für alle (nicht versteckten) Dateien in einem Verzeichnis. So versuche ich es (in 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;
}

Allerdings erhalte ich dadurch im Vergleich zum lsBefehl eine ganz andere Zahl.

Was ist an meinem Ansatz „falsch“? Wie lsberechnet man die Gesamtsumme?

Bearbeiten:

Zum Testen habe ich einen Ordner erstellt, der Dateien enthält test_file1.txt, die test_file2.txtjeweils den Text enthalten Hello World!. Wenn ich ihn ausführe, ls -lerhalte ich die folgende Ausgabe

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

Wenn ich meinen Code jedoch mit der obigen Methode ausführe, erhalte ich

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 

Antwort1

Unter Ubuntu lsist die StandardeinstellungGNUls, welchestandardmäßig 1024-Byte-Blockgrößefür die Zeile „total“. Dies erklärt den Unterschied in der Ausgabe zwischen lsund Ihrem Ansatz: Ihr Ansatz zeigt die doppelte Anzahl von Blöcken an, da er 512-Byte-Blöcke zählt.

Es gibt verschiedene Möglichkeiten, GNU lszum Zählen in 512-Byte-Blöcken zu zwingen (siehe Link oben). Am zuverlässigsten ist die Einstellung LS_BLOCK_SIZE:

LS_BLOCK_SIZE=512 ls -l

Die andere Implementierung, lsdie Sie unter Linux wahrscheinlich antreffen werden, istBusyBox ls; es verwendet auch eine Blockgröße von 1024 Byte für die Zeile „total“ und kann nicht für die Verwendung einer anderen Größe konfiguriert werden.

verwandte Informationen