Betriebssysteme · Institut für Systemarchitektur · Fakultät Informatik · TU Dresden

Studienbegleitendes Praktikum -- Eine einfache Shell




Termin

Die Lösung für diese Aufgabe ist bis zum 14.01.2007 einzureichen.

Aufgabe 3 -- Eine einfache Shell

Ziel dieser Aufgabe soll es sein, Sie mit grundlegenden Konzepten in Bezug auf das Prozeßmanagement unter UNIX vertraut zu machen. Sie werden sich mit den einzelnen Phasen des UNIX-Prozeßmodells beschäftigen und sich mit der Ein- und Ausgabe von UNIX-Prozessen befassen. Darüber hinaus werden Sie sich mit Standardwerkzeugen wie yacc und lex auseinandersetzen.

Implementieren Sie eine Shell, die folgende Funktionalität bereitstellt:

  • Die Shell liest ihre Kommandos von der Standardeingabe und akzeptiert dabei folgende Syntax:
    command [arg1 ... arg9] [< input_redirect] [> output_redirect] [ | command2 ... ] [&].
    Die Kommandos werden syntaktisch analysiert und bei Fehlern mit einer entsprechenden Ausschrift zurückgewiesen. Es soll möglich sein, beliebig viele Programme über eine pipe zu verknüpfen.

Gehen Sie bei der Implementierung in mehreren Schritten vor:

  1. Entwerfen Sie eine Grammatik, die die Syntax der Eingabezeile beschreibt. Setzen Sie diese Syntax mit Hilfe eines Werkzeuges (yacc, lex) oder 'zu Fuß' in ein Programm um. Am Ende der Syntaxanalyse sollten folgende Informationen bereitstehen:
    • Name und Parameter der auszuführenden Programme
    • Informationen über Ein- und Ausgabeumleitungen
    • Soll das ganze als Hintergrundprozeß ausgeführt werden oder nicht.
  2. Implementieren Sie die Ausführung einzelner Kommandos unter Verwendung von fork(), execve() und wait().
  3. Fügen Sie Ein- und Ausgabeumleitung hinzu und nutzen Sie dazu open(), dup2() und close().
  4. Fügen Sie die Kopplung mehrerer Programme über Pipes hinzu. Beachten Sie hierbei die Bedingungen, unter denen eine pipe() ein 'End of File' signalisiert und berücksichtigen Sie das bei Ihrer Implementierung.
  5. Zu guter letzt fügen Sie die Unterstützung für Hintergrundprozesse hinzu. Verwenden Sie hierzu sigaction() und dazugehörige Funktionen.

Eine vollständige Lösung besteht aus den (funktionstüchtigen) Quelldateien sowie einem Makefile zum Übersetzen des Programmes.

Material

Literatur:
  • W.R. Stevens: "Advanced Programming in the UNIX Environment"
  • A. Tanenbaum: "Modern Operating Systems"
  • H. Herold: "lex und yacc: Lexikalische und syntaktische Analyse"
Online-Ressourcen:
Norman Feske, http://os.inf.tu-dresden.de/~nf2/
9. Oct 2006
· Copyright © 2001-2022 Operating Systems Group, TU Dresden | Impressum ·