2009-09-30 4 views
23

Ich bin ein Neuling zu verarbeiten und Thread-Management. Meine Shell sollte PATH Umgebungsvariable verstehen. Es kann eingestellt und modifiziert werden. Es läuft auf zwei Arten - interaktiv & Batch-Modus. Shell kann mehr als einen Job wie ls; ps; wc file; cal. Ich möchte meine Hände auch bei Signalen schmutzig machen. Also sollte ich auch mit^K,^c umgehen.Wie kann ich meine eigene Basis-Unix-Shell in C implementieren?

Ich weiß, ich werde execs, gabeln und pipes verwenden müssen, aber kann einfach nicht beginnen.

+2

Ist das eine Hausaufgaben Frage? Wenn ja, sollten Sie es entsprechend kennzeichnen. – Amok

+2

Nein Es ist nicht so! –

Antwort

14

Alle Unix-Shells sind open-source - ein guter Ausgangspunkt könnte also sein, den Code zu lesen.

Wenn Sie nach einem guten Starter-Artikel zu diesem Thema suchen, versuchen Sie Writing Your Own Shell aus der Linux Gazette.

Ein weiterer guter Startpunkt ist es, einen Blick auf den Quellcode mini-shell zu werfen, nur weil es einer der kleinsten ist, um den Kopf zu bekommen.

8

Ihre Hauptschleife ist:

  • eine Zeile gelesen (Verwendung fgets(3) für eine einfache Schale, readline(3) für eine ausgefallene one)
  • parsen den Befehl
  • fork und führen die Pipelines

Um den Befehl zu analysieren, gibt es zwei allgemeine Möglichkeiten. Schreiben Sie einen rekursiven Descent-Parser oder verwenden Sie yacc(1), um einen zu generieren. Es ist viel einfacher, einen ersten Parser mit Hilfe von yacc zu knacken, aber Sie können total damit aufhören, es zu debuggen, und es möchte wirklich kontextfrei sein. Ich bevorzuge eine rekursive Abstammung, aber fast alle anderen auf der Welt bevorzugen YACC. (Technisch gesehen, bison.) Wenn die Shell wirklich wirklich einfach ist, wie eine Hausaufgaben-Shell, ist yacc möglicherweise übertrieben.

Um die lexikalische Analyse zu machen, können Sie auch Ihre eigenen rollen oder flex verwenden.

Sie müssen keine Threads verwenden.

+3

Ich würde empfehlen, 'readline()' in jedem Fall verwendet werden - es wird Ihr Leben unendlich einfacher, solange Sie die Shell verwenden müssen. Aber +1, um in Yacc/Bison stecken zu bleiben. Gute Tools, aber es ist eine schwierige Aufgabe zu vereinfachen. –

+0

Wenn Sie nur Programme von yoyur Shell ausführen möchten, dann brauchen Sie keinen Parser & Lexer ... aber wenn Sie "andere" Dinge tun wollen, dann empfehle ich Ihnen flex + yacc ... * do nicht rollen Sie Ihre eigenen * – aviraldg

+1

Bin es bekommen. Aber ich möchte meine Hände auch bei Signalen schmutzig machen. Also sollte ich auch mit^K,^c umgehen. –

Verwandte Themen