BUGH Wuppertal Fachbereich 7 - Mathematik Axel Rogat
Betriebssysteme und betriebssystemnahes Programmieren
Übungsblatt 2

Aufgabe 3
Schreiben Sie ein kurzes C-Programm fileinfo, das zu beliebig vielen Dateinamen, die ihm in der Aufrufzeile übergeben werden, mit Hilfe von stat und lstat einige Charakteristika der Dateien ausgibt:
  • den Namen,
  • den Modus-Eintrag (File-Typ und Zugriffsrechte) oktal,
  • die Zugriffsrechte im Klartext (nur rwx),
  • den Typ im Klartext (symlink, directory, regfile, andere dürfen ignoriert werden),
  • den Besitzer und den Gruppenbesitzer im Klartext
  • die Dateilänge in Bytes.

Beispielsweise könnte der Aufruf "fileinfo fileinfo /usr/tmp" folgende Ausgabe erzeugen:

name: fileinfo mode: 0100755 rwxr-xr-x regfile owner: axel group: users length: 3824 name: /usr/tmp mode: 0120777 rwxrwxrwx symlink directory owner: root group: root length: 1024

Hinweise:

  • Beachten Sie, daß Sie bei symbolischen Links nachträglich erfragen müssen, ob das Ziel ein Directory ist (wie hier bei "/usr/tmp").

  • Zu den Bitmasken der Dateitypen (wie S_IFDIR) sind auch Makros definiert (wie S_ISDIR). Nachdem man beispielsweise einen Puffer struct stat statbuf mit der Funktion stat gefüllt hat, kann man wie folgt feststellen, ob die Datei ein Directory ist:
    if (S_ISDIR(statbuf.st_mode)) printf(" directory");
  • Um von den numerischen IDs zum User- bzw. Group-Namen im Klartext zu kommen, können Sie die UNIX-Systemaufrufe getpwuid und getgrgid verwenden (aus pwd.h bzw. grp.h, sie werden in einem späteren Kapitel ausführlich besprochen):
    printf( "%s %s\n", getpwuid(uid->pw_name), getgrgid(gid->gr_name) );

Aufgabe 4
Schreiben Sie ein C-Programm, das eine Directory-Hierarchie als Baum (aus ASCII-Zeichen) ausgibt. Die Wurzel des Baums soll als Aufrufparameter übergeben werden.

Es braucht in keiner Weise (z.B. alphabetisch) sortiert zu werden. Enthaltene Dateien anderen Typs (Nicht-Directories) sollen gar nicht berücksichtigt werden. Für das Wurzelverzeichnis können Sie auch seinen absoluten Pfad ausgeben (per getcwd).

Angewandt auf eine Directory-Struktur, die mit dem Programm aus Aufgabe 1 (Parameter 6) erzeugt wurde, soll folgendes ausgegeben werden (rechts zum Vergleich die übliche Darstellung):

1 +-2 | +-4 | `-5 `-3 `-6
 

Die Ausgabe eines Unterdirectories wird also mit "+-" eingeleitet, die des letzten mit "`-".

Die Ausgabe der Struktur-Zeichen `+', `-', `|' und ``' ist optional, da ihre Verwaltung nicht ganz einfach ist. Wenn Sie darauf verzichten möchten, rücken Sie Unterdirectories einfach um jeweils zwei Spaces ein.

Hinweise:

  • Schreiben Sie eine Funktion show_dir, die sich rekursiv selbst aufruft. Rufen Sie sie im Hauptprogramm für das angegebene Verzeichnis auf (bei fehlenden Aufrufparametern für ".")!

    Am Anfang der Funktion wird in das Verzeichnis hineingewechselt, am Ende wird eine Stufe nach oben gestiegen (jeweils mit chdir). Dazwischen lesen Sie das aktuelle Verzeichnis mit den opendir-Funktionen ein. Für jede Datei erfragen Sie mit lstat, ob es sich um ein Directory handelt. Falls ja, rufen Sie show_dir für dieses Verzeichnis auf.

  • Die Strukturzeichen vor dem Dateinamen verwalten Sie am besten mit einem globalen String, der vor einem Aufruf von show_dir (um "| " oder " ") wächst und danach wieder schrumpft.

  • Beim Durchlaufen globalerer Hierarchien kann es leicht passieren, daß Sie nicht die Zugriffsrechte für eines der Unterdirectories haben. Sie dürfen dann nicht hineinwechseln (chdir) oder es auslesen (opendir).

    Brechen Sie in solchen Fällen nicht Ihr Programm ab, sondern geben Sie hinter dem Directory-Namen den Hinweis "permission denied" (o.ä.) aus.

  • Verirren Sie sich nicht durch symbolische Links auf Verzeichnisse. Stellen Sie einfach den Dateinamen solcher Objekte in Klammern dar und wechseln sie nicht hinein!

  • Beachten Sie, daß in jedem Directory "." und ".." (als Hardlinks) enthalten sind. Geben Sie diese natürlich nicht aus!

  • Wenn Sie mit ``' arbeiten wollen, müssen Sie feststellen, ob ein Unterdirectory das letzte ist. Dazu können Sie das (übergeordnete) Directory z.B. vorab einmal durchlaufen und die enthaltenen Directories zählen!

Eine Anwendung auf das Verzeichnis "/etc" könnte unter Linux z.B. den untenstehenden Baum ausgeben.

/etc +-default +-httpd +-skel | +-.grok | `-.hotjava +-(rc.d) +-mgetty+sendfax `-mail

email: axel@math.uni-wuppertal.de Zurück Abgabe: 10.5.1999
 

© 1999 Axel Rogat