Problem bezüglich anonymen Pipes



  • Hallo allerseits! nach langer Zeit och wieder mal ein Post von mir 😉

    Ich habe folgende Aufgabe zu erledigen:

    Entwickeln Sie ein C-Programm, welches ein Kind-prozess erzeugt. Der Vater-prozess liest Zeichen vom Klavier (bis eben enter gedrückt wird), und sendet diese Daten mit Hilfe eines anonymen Pipes an den Kind-prozess. Dieser bearbeitet diese Zeichen so dass die Zeichen nachher in umgekehrter Reihenfolge wieder an den Vaterprozess gesendet zerden (wieder mit Hilfe von anonymen Pipes), welcher dann die empfangen Daten am Bildschirm anzeigt, und dann nochmals Daten verlangt. Die eingegebenen Zeichenketten sollten nicht von der Länge her eingeschränkt sein. Das Ende des Programms wird mit Hilfe der Eingabe "fin" bewerkstelligt.

    So weit so gut. Ich habe einen Grundteil der aufgabe bereitsgelöst, allerdings bin ich mir nicht ganz sicher ob mein Ansatz richtig ist. Mein Programm list bis jetzt (Karakter für Karakter) Zeichen von der Standardeingabe, und schickt dieses Zeichen direkt via Pipe an den Kind Prozess. Ich seh jetzt allerdings nicht wie ich die Zeichenkette umkehren kann, da ich dazu ja einen Char-array bräuchte (was ich allerdings nicht kann, da ja sonst die Grôsse des eingegebene Strings durch die Länge des Buffers [arrays] limitiert wäre).

    Hier mal den Code den ich bis jetzt hab:

    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <string.h>
    int main(int argc,char **argv)
    {
    	int pid;
    	int tubeDesc[2];
    	char c;
    	char buffer[4];
    	int n;
    	if (pipe(tubeDesc)<0)
    	{
    		printf("\nFehler beim erstellen vom pipe");
    		exit(-1);
    	}
    	buffer[3]='\0';
    	if ((pid=fork())>0)
    	{/*Vatti*/
    		printf("\nVater: bitte text eingeben:");
    
    		while((n=read(0,&c,1))>0)
    		{
    			buffer[0]=buffer[1];
    			buffer[1]=buffer[2];
    			buffer[2]=c;
    			/*write(1,buffer,3);
    			write(1," ",1);*/
    			if (strcmp(buffer,"fin")==0)
    				exit(0);
    			else	
    				write(tubeDesc[1],&c,1);
    		}
    	}
    	else
    	{
    		if (pid<0)
    		{
    			printf("Fehler beim forken\n");
    			exit(-1);
    		}
    		else
    		{/*Junge*/
    			while ((n=read(tubeDesc[0],&c, 1))>0)
    			{
    				write(1,&c,1);
    			}		
    		}
    	}
    	close(tubeDesc);
    	return 0;
    }
    

    Aussedem ist das problem mit dem Beenden des programms bei Eingabe von "fin" schon gelöst.
    Meine Frage wäre also wie ich den Text umdrehen kann wenn die Daten char by char eintreffen (beim Child).
    Ausserdem wäre ich interessiert ob hier jemand vielleicht einen interessanten Link bezüglich Tubes hat (insbesondere der anonymen)

    Danke bereits im Voraus!!



  • hej,
    keine ahnung ob ich dich richtig verstanden habe aber ich versuchs mal. für das problem mit der speicherung könntest du folgendes machen: du allokierst mit malloc() ein char ( 1 byte ). jedesmal wenn ein buchstabe hinzukommt allokierst du neuen speicher der 1 byte größer ist und kopierst den inhalt vom alten in den neuen und fügst den neuen buchstaben hinzu. den alten allokierten speicher gibst du natürlich wieder frei. ist vielleicht nicht die beste möglichkeit aber sollte für ein problem ausreichen.

    blan



  • Würde es machen wie blan vorgeschlagen hat.
    Nur, fang mit einem Array von z.B. 100 Bytes an. Werden es mehr Daten reservier ein neues Array mit z.B. 30% (oder 50%) mehr Speicher.
    Dann liest du blockweise statt byteweise.

    Ist vom Prinzip aber egal.

    Wenn du C++ verwenden kannst/willst nimm std::string + getline.



  • Super! Danke hat einwandfrei funktioniert!

    Danke!!


Anmelden zum Antworten