[LINUX] Ich verfolgte die Implementierung des Befehls du (zweite Hälfte)

Einführung

Dies ist eine Fortsetzung von Letztes Mal. Wir werden die Implementierung des Befehls du weiterhin verfolgen.

Rezension

Ich werde die du_files (), die ich das letzte Mal gesehen habe, erneut veröffentlichen.

python


/* Recursively print the sizes of the directories (and, if selected, files)
   named in FILES, the last entry of which is NULL.
   BIT_FLAGS controls how fts works.
   Return true if successful.  */

static bool
du_files (char **files, int bit_flags)
{
  bool ok = true;

  if (*files)
    {
      FTS *fts = xfts_open (files, bit_flags, NULL); //(1)

      while (1)
        {
          FTSENT *ent;

          ent = fts_read (fts); //(2)
          if (ent == NULL)
            {
              if (errno != 0)
                {
                  error (0, errno, _("fts_read failed"));
                  ok = false;
                }
              break;
            }
          FTS_CROSS_CHECK (fts);
          ok &= process_file (fts, ent); //(3)
        }

      if (fts_close (fts) != 0)
        {
          error (0, errno, _("fts_close failed"));
          ok = false;
        }
    }

  return ok;
}

Die hier durchgeführte Verarbeitung ist die folgenden drei.

(1). Holen Sie sich die FTS-Struktur aus dem Dateinamen mit xfts_open (). (2) Holen Sie sich die FTSENT-Struktur aus der FTS-Struktur mit fts_read (). --- Bis zum letzten Mal (3) Rufen Sie "process_file ()" auf und kehren Sie zu (2) zurück.

Die Figur ist wie folgt. du.jpeg

Dieses Mal werden wir uns process_file () in (3) ansehen.

process_file()

python


static bool
process_file (FTS *fts, FTSENT *ent)
{
  bool ok = true;
  struct duinfo dui;
  struct duinfo dui_to_print;
  size_t level;
  static size_t prev_level;
  static size_t n_alloc;
  static struct dulevel *dulvl;

  const char *file = ent->fts_path;
  const struct stat *sb = ent->fts_statp;

  //Fortsetzen

Schauen wir uns die Variablen an.

duinfo_set() Rufen Sie dann duinfo_set () auf.

python


duinfo_set (&dui,
            (apparent_size
             ? MAX (0, sb->st_size)
             : (uintmax_t) ST_NBLOCKS (*sb) * ST_NBLOCKSIZE),
            (time_type == time_mtime ? get_stat_mtime (sb)
             : time_type == time_atime ? get_stat_atime (sb)
             : get_stat_ctime (sb)));

python


static inline void
duinfo_set (struct duinfo *a, uintmax_t size, struct timespec tmax)
{
  a->size = size;
  a->inodes = 1;
  a->tmax = tmax;
}

duinfo_set () ist eine Funktion, die die Dateigröße und den Zeitstempel im ersten Argument dui festlegt.

scheinbar_size ist ein Flag, das die tatsächliche Dateigröße und nicht die Festplattennutzung ausgibt. Die Datenträgerverwendung einer Datei ist die Dateigröße, die auf die Blockgröße des Dateisystems aufgerundet wird. Wenn die Blockgröße beispielsweise 4 KByte und die Dateigröße 8,5 KByte beträgt, beträgt die Festplattennutzung 12 KByte. Der Befehl du zeigt standardmäßig die Festplattennutzung an. Wenn scheinbar_size wahr ist, wird die tatsächliche Dateigröße an das Argument von duinfo_set () übergeben, und wenn es falsch ist, wird die Blockverwendung übergeben.

Dateigröße hinzufügen

Die Dateigröße wurde in dui von duinfo_set () festgelegt. Siehe den nächsten Prozess.

python


level = ent->fts_level;
dui_to_print = dui;

Geben Sie die Tiefe der Dateihierarchie in "Ebene" ein. Setze auch dui_to_print.

Der nächste Schritt besteht darin, die Dateigröße "dui" zur Verzeichnisgröße hinzuzufügen. Die Verarbeitung ist in die folgenden drei Muster unterteilt.

  1. Wenn Sie sich in derselben Dateihierarchie befinden, der Sie gefolgt sind
  2. Wenn Sie die Dateihierarchie durchgehen und die Tiefe erhöhen
  3. Wenn Sie die Dateihierarchie nach oben gehen und die Tiefe abnimmt

1. Wenn Sie sich in derselben Dateihierarchie befinden, der Sie gefolgt sind

python


prev_level = level;

if (! (opt_separate_dirs && IS_DIR_TYPE (info)))
  duinfo_add (&dulvl[level].ent, &dui);

duinfo_add (&tot_dui, &dui);

Fügen Sie zunächst die Dateigröße von dui zu duvlv [level] .ent hinzu. dulvl [level] ist eine Struktur, die Informationen über Verzeichnisse in der Tiefe level verarbeitet. Hier wird die Gesamtdateigröße derselben Hierarchie berechnet. Beachten Sie, dass "opt_separate_dirs" eine Option ist, die die Größe des Unterverzeichnisses nicht enthält, und "IS_DIR_TYPE (ent-> fts_info)" wahr ist, wenn die angezeigte Datei ein Verzeichnis ist. Das heißt, wenn Sie keine Unterverzeichnisse einschließen, wird die Größe der Verzeichnisse nicht hinzugefügt. Als nächstes fügen Sie die Dateigröße auch zu "tot_dui" hinzu. tot_dui ist die Summe aller Dateigrößen.

2. Wenn Sie die Dateihierarchie durchgehen und die Tiefe erhöhen

python


size_t i;

for (i = prev_level + 1; i <= level; i++)
    {
      duinfo_init (&dulvl[i].ent);
      duinfo_init (&dulvl[i].subdir);
    }

prev_level = level;

if (! (opt_separate_dirs && IS_DIR_TYPE (info)))
  duinfo_add (&dulvl[level].ent, &dui);

duinfo_add (&tot_dui, &dui);

Wenn Sie die Dateihierarchie durchgehen, befinden Sie sich zum ersten Mal in diesem Verzeichnis. Initialisieren Sie also "dulvl [i]" mit "duinfo_init ()". Der Rest des Prozesses ist der gleiche wie zuvor.

3. Wenn Sie die Dateihierarchie nach oben gehen und die Tiefe abnimmt

python


duinfo_add (&dui_to_print, &dulvl[prev_level].ent);
if (!opt_separate_dirs)
  duinfo_add (&dui_to_print, &dulvl[prev_level].subdir);
duinfo_add (&dulvl[level].subdir, &dulvl[prev_level].ent);
duinfo_add (&dulvl[level].subdir, &dulvl[prev_level].subdir);

prev_level = level;

if (! (opt_separate_dirs && IS_DIR_TYPE (ent->fts_info)))
  duinfo_add (&dulvl[level].ent, &dui);

duinfo_add (&tot_dui, &dui);

Wenn Sie die Dateihierarchie aufrufen, ist der vorherige Speicherort das aktuelle Unterverzeichnis. Fügen Sie daher die Kapazität des vorherigen Verzeichnisses zu "dui_to_print" und "dulvl [level] .subdir" hinzu.

Wenn es sich bei der angezeigten Datei um ein Verzeichnis handelt, wird die Verzeichniskapazität angezeigt.

python


if ((IS_DIR_TYPE (ent->fts_info) && level <= max_depth)
    || ((opt_all && level <= max_depth) || level == 0))
  print_size (&dui_to_print, file);

abschließend

Dies ist das erste Mal, dass ich den Quellcode eines Befehls lese, aber es wird auch Anfängern empfohlen, da der Code nicht lang ist und das Funktionsprinzip einfach ist. Es macht auch Spaß zu lesen, während das Funktionsprinzip des Befehls vorweggenommen wird.

Recommended Posts

Ich verfolgte die Implementierung des Befehls du (zweite Hälfte)
Ich verfolgte die Implementierung des Befehls du (erste Hälfte)
[Linux] Ich habe versucht, die Ressourcenbestätigungsbefehle zusammenzufassen
Ich habe den Mechanismus der Flaschenanmeldung untersucht!
[Python] Ich habe die Theorie und Implementierung des Entscheidungsbaums gründlich erklärt
Ich brachte AI dazu, über die Texte von Genshi Yonezu nachzudenken (Implementierung)
Ich habe versucht, die häufig verwendete Implementierungsmethode von pytest-mock zusammenzufassen
Ich habe den Befehl worldcup verwendet, um das Ergebnis der Weltmeisterschaft zu überprüfen.
Ich möchte einen beliebigen Befehl im Befehlsverlauf von Shell belassen
Ich habe versucht, den Befehl umask zusammenzufassen
Ich habe die Optionen von copyMakeBorder von OpenCV überprüft
Othello-Aus der dritten Zeile von "Implementation Deep Learning" (3)
Die Ordnerstruktur von Flask ist zusammengefasst
Ich kannte die Grundlagen von Python nicht
Migemo-Version des Befehls: find,: mfind
Die Python-Projektvorlage, an die ich denke.
Die zweite Nacht der Runde mit für
Lesen Sie die Implementierung des globalen ARM-Timers
Beachten Sie den Abschluss eines zeitaufwändigen Befehls
Othello-Aus der dritten Zeile von "Implementation Deep Learning" (2)
Ich habe einen Appdo-Befehl erstellt, um Befehle im Kontext der App auszuführen
Ich möchte dem Anfang einer WAV-Datei 1 Sekunde lang Stille hinzufügen
Ich habe versucht, die Wetterkarte einer Clusteranalyse zu unterziehen
Ich habe das tiefste Problem von Hiroshi Yuki gelöst.
Warum die Python-Implementierung von ISUCON 5 Bottle verwendet
Ich habe die Liste der Tastenkombinationen von Jupyter überprüft
Ich habe versucht, die Trapezform des Bildes zu korrigieren
Probieren Sie Progate Free Edition [Python I]
Ich habe die Sitzungsaufbewahrungsdauer von Django überprüft
Die Geschichte des Fehlinterpretierens der Swap-Zeile des obersten Befehls
Ich habe die Verarbeitungsgeschwindigkeit der numpy eindimensionalisierung überprüft
Ich habe einige der neuen Funktionen von Python 3.8 touched angesprochen
Prognostizieren Sie die zweite Runde des Sommers 2016 mit scikit-learn
Ich habe die Varianten von UKR gelesen und implementiert
Ich möchte das Erscheinungsbild von zabbix anpassen
Ich habe versucht, den Bildfilter von OpenCV zu verwenden
Ich habe versucht, die Texte von Hinatazaka 46 zu vektorisieren!
Zweite Hälfte des ersten Tages des Python-Studiums Versuchen Sie, die Twitter-API mit Bottle zu erreichen
Ich habe mir den Inhalt von sklearn (scikit-learn) angesehen. (1) ~ Was ist mit der Implementierung von CountVectorizer? ~
Ich möchte auch Linux-Befehle an der Eingabeaufforderung verwenden! Verwenden Sie Linux-Befehle an der Eingabeaufforderung anstelle von Git Bash