Übungen Betriebssysteme (BS)

U5 – Dateioperationen

Alwin Berger

🚀 by Decker

Agenda

Hauptthemen

  • Dateien und Dateisysteme
  • Schnittstellen für Dateioperationen in C

Zusatzinhalte

  • Festplatten
  • RAID

Dateien und Dateisysteme

  • Daten auf einer Festplatte werden meistens zu abgeschlossenen Datenmengen, zu sogenannten Dateien abgefasst
  • Dateien können je nach Anwendung in unterschiedlichsten Dateiformaten vorliegen und besitzen neben einen Dateinamen weitere Meta-Informationen wie Dateigröße, Besitzer, etc…
  • Das Dateisystem legt fest, wie und wo Dateien auf der Festplatte gehalten, geschrieben und gelöscht werden

Ordner

  • Viele Dateisysteme erlauben das organisieren von Dateien in Verzeichnisstrukturen
    • Rekursive, baumartige Struktur (Verzeichnisbaum)
  • Jede Datei besitzt einen eindeutigen Dateipfad

Dateiartige Objekte

  • UNIX-Systeme bilden unterschiedliche Betriebsmittel auf das Dateisystem (als ‘nichtreguläre Dateien’) ab:
    • Symbolische Links
    • E/A-Geräte und Datenträger
    • Feststehende Programmverbindungen (Named Pipes / FIFOs)
    • Netzwerkkommunikationsendpunkte (Sockets)
  • Eine wie zuvor definierte Datei wird als regulär bezeichnet

Dateioperationen in C

  • Exemplarischer Ablauf
    1. Datei öffnen
    2. Lesen
    3. Schreiben
    4. Datei schließen
  • Öffnen einer Datei liefert Handle
    • Wird bei jeder Operation gebraucht - inkl. Schließen
    • Vermerkt den Modus (Lesen, Schreiben, beides) der geöffneten Datei
    • Beinhaltet Schreib-Lese-Zeiger
  • Eine Datei kann mehrfach geöffnet werden
  • Dateien müssen nach ihrer Verwendung geschlossen werden
    → Vermeidung von Ressourcenlecks

Schnittstellen für Dateioperationen in C

  • Unter Linux gibt es mehrere Möglichkeiten
    • Syscall-Wrapper der C-Bibliothek (“low-level”), z.B. open(2)
    • Arbeitet mit Dateideskriptoren.
    • Nur eingeschränkt auf andere Betriebssysteme anwendbar
    int open(const char *path, int flags)
      syscall(__NR_open, path, flags)
    • Abstrakte Stream-Schnittstelle in C (“high-level”), z.B. fopen(3) aus stdio.h
    • Abstraktion von Dateideskriptoren zu (gepuffertem) Strom
    FILE* fopen(const char *path, const char *mode)

“low-level”-Dateioperationen

  • open(2): Datei öffnen
    • int open(const char *path, int flags)
    • Gibt Dateideskriptor zurück - wird später benötigt
  • read(2): Aus Datei lesen
    • size_t read(int fd, void *buf, size_t count)
  • lseek(2): Schreib-/Leseposition verändern
    • off_t lseek(int fd, off_t offset, int whence)
  • close(2): Offene Datei schließen
    • int close(int fd)
  • Standardisierte Schnittstelle, u.a. in POSIX.1-2001

C-Streams (“high-level”)

  • Abstrakter, plattformübergreifender Kommunikationskanal (z.B. unter Windows)
  • Teil des C-Standards!
  • Interne Pufferung: Blockweises Lesen → höhere Verarbeitungsgeschwindigkeit
  • Unabhängiges Lesen und Schreiben an verschiedenen Positionen
  • Stream-Repräsentation durch struct FILE
  • Definierte Standard-Streams: stdin, stdout, stderr

“high-level”-Dateioperationen (1)

  • fopen(3): Datei öffnen
    • FILE* fopen(const char *path, const char *mode)
    • mode: z.B. “r” (Lesen), “r+” (Schreiben & Lesen), “a” (Anhängen)
      • Gibt Zeiger auf FILE-Datenstruktur zurück - wird später benötigt
  • fread(3): Aus Datei lesen
    • size_t fread(void *buf, size_t itemsize, size_t count, FILE *stream)
  • fseek(3): Schreib-/Leseposition verändern
    • off_t fseek(FILE *stream, off_t offset, int whence)
  • fclose(3): Offene Datei schließen
    • int fclose(FILE *stream)

“high-level”-Dateioperationen (2)

  • ftell(3): Gibt den Datei-Positionszeiger für den Stream stream aus
    • long ftell(FILE *stream)
  • fscanf(3): Liest den Inhalt einer Datei gemäß Formatstring aus
    • int fscanf(FILE *stream, const char *format, ...)
    • Funktioniert wie scanf(3)
  • fprintf(3): Schreibt einen formatierten String in eine Datei
    • int fprintf(FILE *stream, const char *format, ...)
    • Analog zu printf(3)
  • Ebenfalls standardisierte Schnittstelle, u.a. in POSIX.1-2001

fopen(3) im Detail

fopen

Das FILE-Objekt

  • Das FILE-Objekt enthält neben dem Dateideskriptor zum identifizieren einer geöffneten Datei auch den Modus sowie Zeiger auf den Puffer inklusive den Positionszeiger
  • Achtung: Auf die Felder des FILE-Objekts darf nicht direkt zugegriffen werden, da dies laut C-Standard zu undefinierten Verhalten führt!
  • Je nach System unterscheiden sich die Implementierungen von FILE
  • DIR-Objekt als Analogon für Verzeichnisse

Dateiinformationen abfragen und auswerten

  • Dateien haben verschiedene Eigenschaften
    • Typ, Eigentümer:in (Nutzer:in und Gruppe), Größe, Berechtigungen
  • Abfrage mit int stat(const char* pathname, struct stat* statbuf);
    • Untersucht die Datei bzw. das dateiartige Objekt auf welches der Pfad path verweist und liefert bei Erfolg 0
    • Die Resultate dieser Untersuchung werden in finfo gespeichert
    • S_ISREG(statbuf.st_mode) liefert für eine reguläre Datei true
    • S_ISDIR(statbuf.st_mode) liefert für ein Verzeichnis true

Verzeichnisoperationen

  • opendir(3): Öffnet ein Verzeichnis zum Lesen
    • DIR* opendir(const char *path)
    • Liefert einen Zeiger auf DIR-Datenstruktur - wird später benötigt
  • readdir(3): Liest den nächsten Eintrag aus dem Verzeichnis
    • struct dirent* opendir(DIR *dir)
    • Liefer einen Zeiger auf dirent-Datenstruktur
    • Gibt Auskunft über den aktuellen Eintrag im Verzeichnis
    • Siehe man 3 readdir
  • closedir(3): Schließt das aktuelle Verzeichnis
    • int closedir(DIR *dir)

Dateipfade in C erstellen

  • Speicherplatz für zu konstruierenden Pfad sicherstellen
  • Benötigter Speicher hängt von der Länge ab
    • “foo/bar.txt” vs. “irgendein/furchtbar/langer/Pfad.txt”
  • Zur Erinnerung:
    • Länge einer Zeichenkette mit strlen(3) bestimmen
    • Speicher mit malloc(3) allozieren un später freigeben (free(3))
int bufsize = strlen("foo") + strlen("bar") + 2;

char *buf = malloc(bufsize);
if (buf == NULL) { /* Fehler */ }

snprintf (buf, bufsize, "%s/%s", "foo", "bar");
// buf enthält jetzt "foo/bar" (inkl. Nullterminator)

Zusatzinhalte

Festplatten und Bandlaufwerke

images/U5/pages/Festplatten-page-02.svg

images/U5/pages/Festplatten-page-03.svg

images/U5/pages/Festplatten-page-04.svg

images/U5/pages/Festplatten-page-05.svg

images/U5/pages/Festplatten-page-06.svg

images/U5/pages/Festplatten-page-07.svg

images/U5/pages/Festplatten-page-08.svg

images/U5/pages/Festplatten-page-09.svg

images/U5/pages/Festplatten-page-10.svg

images/U5/pages/Festplatten-page-11.svg

images/U5/pages/Festplatten-page-12.svg

images/U5/pages/Festplatten-page-13.svg

images/U5/pages/Festplatten-page-14.svg

images/U5/pages/Festplatten-page-15.svg

images/U5/pages/Festplatten-page-16.svg

images/U5/pages/Festplatten-page-17.svg

images/U5/pages/Festplatten-page-18.svg

images/U5/pages/Festplatten-page-19.svg

images/U5/pages/Festplatten-page-20.svg

images/U5/pages/Festplatten-page-21.svg

images/U5/pages/Festplatten-page-22.svg

images/U5/pages/Festplatten-page-23.svg

images/U5/pages/Festplatten-page-24.svg

images/U5/pages/Festplatten-page-25.svg

images/U5/pages/Festplatten-page-26.svg

images/U5/pages/Festplatten-page-27.svg

images/U5/pages/Festplatten-page-28.svg

images/U5/pages/Festplatten-page-29.svg

images/U5/pages/Festplatten-page-30.svg

images/U5/pages/Festplatten-page-31.svg

images/U5/pages/Festplatten-page-32.svg

images/U5/pages/Festplatten-page-33.svg

images/U5/pages/Festplatten-page-34.svg

images/U5/pages/Festplatten-page-35.svg

images/U5/pages/Festplatten-page-36.svg

images/U5/pages/Festplatten-page-37.svg

images/U5/pages/Festplatten-page-38.svg

images/U5/pages/Festplatten-page-39.svg

images/U5/pages/Festplatten-page-40.svg

images/U5/pages/Festplatten-page-41.svg

images/U5/pages/Festplatten-page-42.svg

images/U5/pages/Festplatten-page-43.svg

images/U5/pages/Festplatten-page-44.svg

images/U5/pages/Festplatten-page-45.svg

images/U5/pages/Festplatten-page-46.svg

images/U5/pages/Festplatten-page-47.svg

images/U5/pages/Festplatten-page-48.svg

images/U5/pages/Festplatten-page-49.svg

images/U5/pages/Festplatten-page-50.svg

images/U5/pages/Festplatten-page-51.svg

images/U5/pages/Festplatten-page-52.svg

RAID

images/U5/pages/RAID-page-02.svg

images/U5/pages/RAID-page-03.svg

images/U5/pages/RAID-page-04.svg

images/U5/pages/RAID-page-05.svg

images/U5/pages/RAID-page-06.svg

images/U5/pages/RAID-page-07.svg

images/U5/pages/RAID-page-08.svg

images/U5/pages/RAID-page-09.svg

images/U5/pages/RAID-page-10.svg