Verständnisfrage C, Pipeline, Programmaufruf
-
Hallo Forum,
ich befasse mich seit kurzem schulisch mit C und der Shell. Mein Dozent hat nun folgende Aufgabe gestellt, mit der ich leider gar nicht zurechtkomme:
Schreiben Sie in C oder C++ eine Shell, die Pipelines mit 2 Prozessen ausfuehren kann.
Der Shell-Hauptprozess soll warten, bis beide Pipeline-Teilnehmer fertig sind.
Testen Sie, ob die Synchronisation bei blockiertem Leser bzw. Schreiber funktioniert.Syntax: Programmaufruf | Programmaufruf
Beispiel: ls -l /tmp | wc -lGrundsätzlich weiß ich zwar, dass ich mit fork() einen Child-Prozess erzeuge und mit waitpid() auf bestimmte Prozesse warten kann, jedoch fehlt mir hierbei der Anfang. Ich kompiliere meine .c Datei mit gcc und kann dann per ./a.out die Ausgabe über die Shell machen.
Ich verstehe gerade nicht so ganz wie ich ein C-Prog schreiben soll, welches ich dann per Syntax: Programmaufruf | Programmaufruf aufrufen kann.
Könnte mir da jemand vielleicht erklären wie ich das angehe? Auch würde mich interessieren wie "Pipelines mit 2 Prozessen" zu verstehen ist
Vielen Dank und sry für meine Noobigkeit!
Viele Grüße, Daniel!
-
Wenn ich das richtig verstehe, sollst du die Shell schreiben, die dann Befehle der Art
Programmaufruf | anderer Programmaufruf
so verarbeiten kann wie es die gängigen Shells tun.
-
Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C (C89 und C99) in das Forum Linux/Unix verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Stichwort: man: pipe(2). Mit google und der Forensuche solltest du weiter kommen.
-
Danke für die schnellen Antworten
Das Hauptverständnisproblem was ich aber noch habe ist, wie ich, wenn ich meine C-Datei geschrieben habe, diesen "Aufruf | Aufruf" durchführe.
$ ./a.out | ./a.out etwa?
-
du musst eine pipe erzeugen und zweimal forken. Dann das stdout des einen Prozesses auf die Eingangsseite der pipe setzen (man: dup2(2)) und bei dem anderen Prozess die Ausgangsseite des Prozesses auf stdin setzen und jeweils man: execl aufrufen.
-
Nein, Du sollst wohl eine Shell schreiben, die Befehle entgegennimmt. Die rufst Du auf und da tippst Du dann eben Deinen Befehl mit Pipe ein.
-
Also bin mir jetzt nicht sicher, ob ich das richtig verstanden habe.
Vermutlich soll das so funktionieren:
programmA | programmB | programmC
wie bei folgendem Kommando: ls | grep "Datei"
d.h. programmA schreibt in den stdout, programmB empfängt das über über die pipe über stdin usw...
-
Es soll so funktionieren ($ ist der prompt der echten shell, > der deiner shell)
$ ./my_shell
> ls -l | grep XX
> *Ausgabe kommt hier*
> quit
$
verstanden?
(Das quit steht glaub ich nicht in der Aufgabenstellung, ist aber ein nettes Feature (Strg-C ist immer so brutal))
-
linux_c89 schrieb:
Strg-C ist immer so brutal)
Aus diesem Grund fange ich
SIGINT
immer ab und beende dann selber.
-
STRG+D, anyone?