Funktionen

Print[PRINT]
.  Home  .  Lehre  .  Praktika  .  Wintersemester 2009/10  .  Systempraktikum  .  Klausurcheckliste

Systempraktikum

Praktikum im Wintersemester 2009/2010 (LMU)
Prof. Dr. Dieter Kranzlmüller, Dr. Thomas Schaaf, Dr. Nils gentschen Felde

Klausurcheckliste (Zwischenklausur)

Die nachfolgende Liste ist zusätzlich zu den Übungsaufgaben als Hilfestellung für die Vorbereitung auf die Zwischenklausur gedacht. Es besteht natürlich kein Anspruch auf Vollständigkeit. Klausurrelevant ist der gesamte bisher im Praktikum behandelte Stoff (Module 1 bis 3).

Der Sinn dieser Liste: Überprüfen Sie anhand der Checkliste, ob Sie alle Fragen beantworten können und die dahinterstehenden Konzepte verstanden haben und in der Programmierpraxis anwenden können. Vergewissern Sie sich, dass Sie mit den aufgeführten Bibliotheksfunktionen und Shell-Kommandos vertraut sind und diese in eigenen Programmen korrekt verwenden können. Sie sollten außerdem in der Lage sein, fremde Programme zu analysieren. Die Checkliste soll Ihnen helfen, herauszufinden, in welchen Themenbereichen Sie noch Lücken haben. Einige Fragen sollen außerdem zum Selbst-Ausprobieren anregen.

Nicht Sinn dieser Liste: Auf gar keinen Fall ersetzt das Beantworten der Fragen und das Nachschlagen in den Manpages zu den aufgeführten Funktionen und Kommandos die praktische Einübung anhand selbst gewählter Beispiele sowie anhand der Übungsaufgaben.

  • Zeichenketten und Arrays:
    • Auf welche Arten lassen sich Arrays definieren und initialisieren?
    • Wie lässt sich auf Werte und Adressen von Array-Elementen zugreifen? Welche unterschiedlichen Möglichkeiten führen zu gleichen Resultaten?
    • Wie lassen sich Zeichenketten (Strings) mit Hilfe von Arrays realisieren?
    • Wie werden insb. Zeichen (Character) im Speicher repräsentiert, und wie viel Platz benötigen sie dort?
    • Wie funktioniert das Prinzip nullterminierter Zeichenketten?
  • Speicher und Adressen:
    • Wie lässt sich Speicher dynamisch allozieren und wieder freigeben?
    • Was versteht man unter einem Pointer?
    • Wie lassen sich Pointer-Variablen definieren?
    • Warum sind Pointer-Variablen typisiert, und worauf sollte man beim Umgang mit ihnen achten?
    • Wofür werden der Adress- und der Dereferenzierungsoperator benötigt? Wie werden sie eingesetzt?
    • Was versteht man unter Adressarithmetik? Was passiert insb. beim Inkrementieren oder Dekrementieren eines Pointers in Abhängigkeit von dessen Typ?
  • E/A und Dateien:
    • Nach welchem Muster funktioniert die Verwaltung und Vergabe von Dateiberechtigungen in Unix-Dateisystemen?
    • Wie lassen sich Dateien öffnen und/oder erstellen?
    • Was versteht man genau unter einem Filedeskriptor?
    • Wo werden Filedeskriptoren eingesetzt?
    • Wozu werden die Standard-Filedeskriptoren benötigt?
    • Was versteht man unter gepuffertem Lesen/Schreiben?
    • Wie lässt sich eine Ausgabe auf die Konsole realisieren?
    • Welche Ausgabe-Umwandlungszeichen (%...) gibt es, und wie werden sie eingesetzt?
  • C-Strukturen:
    • Was versteht man unter einer C-Struktur?
    • Wie lassen sich Strukturtypen definieren?
    • Wie lassen sich Objekte eines zuvor definierten Strukturtyps anlegen und befüllen/manipulieren?
    • Worin besteht in diesem Zusammenhang der Unterschied zwischen der Punkt- und der Pfeil-Notation?
  • Funktionen und Schnittstellen:
    • Wie werden Funktionen deklariert/definiert? Wie werden Aufrufparameter und Rückgabewerte festgelegt?
    • Woran erkennt man rekursive Funktionen?
    • Welche Arten der Parameterübergabe gibt es, und wie sollten sie eingesetzt werden?
    • Wann sollten const-deklarierte Parameter verwendet werden?
    • Welche Rolle spielen Headerdateien im Zusammenhang mit Schnittstellenbeschreibungen und Modularisierung?
  • Prozesse:
    • Wie ist die Unix-Prozesshierarchie durch die Einträge in den PCBs der Prozesse abgebildet?
    • Wie funktioniert die Funktion fork()?
    • Wie lässt sich nach fork() zwischen Eltern- und Kindprozess differenzieren?
    • Wie können Prozesse überlagert werden?
    • Was versteht man unter Waisen- und Zombieprozessen?
    • Wodurch können Waisen- oder Zombieprozesse herbeigeführt werden?
    • Wie können Waisen- oder Zombieprozesse vermieden werden?
    • Welche Rolle spielt der init-Prozess (insgesamt und im Zusammenhang mit Waisenprozessen)?
  • Pipes:
    • Was versteht man unter einer (unbenannten) Pipe?
    • Was passiert mit einer Pipe beim Anlegen eines Kindprozesses?
    • Wie wird in eine Pipe geschrieben/aus einer Pipe gelesen?
    • Was passiert, wenn mehrere Kindprozesse aus der selben Pipe lesen?
  • Makefiles:
    • Welche Elemente werden in einem Makefile definiert, und wie?
    • Wo finden Makefiles Anwendung, und was ist in diesem Zusammenhang alles zu beachten?
    • Inwiefern können Makefiles Modularisierung unterstützen?
  • Programmieren und Übersetzen:
    • Welche Arten von Fehlern können beim Programmieren prinzipiell auftreten? Welche können vom Compiler entdeckt werden, welche nicht?
    • Was versteht man unter einer umfassenden Fehlerbehandlung, und warum ist diese wichtig?
    • Was ist der Unterschied zwischen Fehlern und Warnungen? Warum erzeugen manche schwerwiegende programmiertechnische Fehler trotzdem nur eine Warnung?
  • Wichtige C-Bibliotheksfunktionen:
    • printf
    • fprintf
    • scanf
    • atoi
    • atof
    • putc
    • open
    • close
    • read
    • write
    • malloc
    • free
    • sizeof
    • fork
    • execve/execl/execv/execle/execvp/execlp
    • wait/waitpid
    • getpid
    • getppid
    • sleep
    • pipe
  • Wichtige Shell-Kommandos:
    • man
    • gcc
    • make
    • ps
    • top