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 -l

    Grundsä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!


  • Mod

    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.


  • Mod

    STRG+D, anyone?


Log in to reply