Universität Ulm - Abteilung Angewandte Informationsverarbeitung
10.Übungsblatt (16.01.01 bis 23.01.01)
zur Vorlesung Allgemeine Informatik III (WS 00/01)



Hey -- wo ist denn der andere Hardlink auf die Datei?

Unter UNIX gibt es das (über-)mächtige Kommando find. Find kann alles, außer Radfahren. Find ist sogar in der Lage, zu einer Datei, auf die mehrere (Hard-)Links existieren, die Namen der Links rekursiv aufzuspüren (Option -inum):

thales$ ls -li
   1138494 drwxrwsr-x   2 grabert  sai          512 Jan 15 11:49 fest
   1093365 -rw-rw-r--   1 grabert  sai         1334 Jan 15 11:23 ftype.c
    892943 -rw-rw-r--   3 grabert  sai            0 Jan 15 11:30 rest
    892943 -rw-rw-r--   3 grabert  sai            0 Jan 15 11:30 test
thales$ ls -li fest
    892943 -rw-rw-r--   3 grabert  sai            0 Jan 15 11:30 pest
thales$ find . -inum 892943
./test
./rest
./fest/pest

Aufgabe 1 (10 Punkte)

Schreiben Sie das C-Programm twin.c, das (wie find) zu einer auf der Kommandozeile übergebenen Datei alle Hardlinks im aktuellen Directory auflistet, die auf die gleiche Datei zeigen. Verwenden Sie zum Durchsuchen des aktuellen Verzeichnisses die Befehle opendir(), readdir() und closedir(). (Siehe Manual und Beispiel aus den Übungen).

Beispiel:
thales$ twin test
./test
./rest

Tipp: eindeutig für die physikalische Repräsentierung einer Datei ist die Inodenummer. Sie müssen also alle Dateien auf dem aktuellen Directory finden, die die gleiche Inodenummer wie die übergebene Datei haben. Der Aufruf von stat() liefert u.a. die Inodenummer. (So ein Glück!)

Achtung: Softlinks erhöhen weder den Linkcount, noch verweisen sie auf die gleiche Inodenummer wie die Zieldatei. Softlinks können also bei der Suche ignoriert werden. (find findet diese Links auch nicht!)
 

Aufgabe 2 (10 Punkte)

Erweitern Sie twin.c dahingehend, dass -- ausgehend vom aktuellen Directory -- auch alle Unterverzeichnisse nach evtl. Hardlinks durchsucht werden.

Beispiel:
thales$ twin test
./test
./rest
./fest/pest

Tipp: prüfen Sie ab, ob ein Namenseintrag im aktuellen Katalog (geliefert von readdir) auf ein Unterverzeichnis verweist oder nicht (siehe ftype.c aus der Vorlesung). Falls ja, können Sie rekursiv via chdir in das Unterverzeichnis wechseln und dort weitersuchen.

Achtung:   jeder Katalog hat mindestens zwei Verzeichniseinträge: "." (Verweis auf aktuellen Katalog) und ".." (Verweis auf eine Ebene höher im Pfad). Diese beiden Einträge müssen jeweils übergangen werden!!!! Ansonsten dreht sich ihr Programm im Kreise!!! (Endlosschleife, Prozessorüberhitzung und Liebesentzug vom Tutor sind die Folge ...)

Aufgabe 2 löst natürlich Aufgabe 1 mit.