Pipes?
-
Hallo,
ich habe ein Programm das ständig auf stdin eingaben wartet und dementsprechend irgend etwas macht. Jetzt möchte ich selbst ein Programm schreiben, dass dieses Programm startet und ihm wenn es nötig ist die entsprechenden Befehle schickt, diese werden dann von dem anderen Programm bearbeitet während mein Programm weierläuft. Dummerweise weiß ich nicht ganz wie das geht. Ich habe mir mschon einiges über Pipes durchgelesen, aber irgendwie ist das immer recht speziell.
Also im Endeffekt muss ja mein Programm nur immer ab und zu etwas an den stdin des anderen Programmes schicken.
Kann mir da jemand helfen?
-
müsste ungefähr so funktionieren (ungetestet)
int pipes[2]; if(pipe(pipes) == -1) { perror("pipe"); return 1; } pid_t pid=fork(); if(pid == 0) { close(pipes[1]); dup2(pipes[0], STDIN_FILENO); execlp("program", "program", NULL); exit(1); } else if(pid==-1) { perror("fork"); return 1; } close(pipes[0]); write(pipes[1], befehle, strlen(befehle)); //... wait(NULL);
-
Wenn dein Programm nur etwas an das andere Programm senden muss, ohne die Ausgaben des anderen Programms abzufragen, kannst du das Ganze noch einfacher mit popen() lösen, Beispiel:
FILE *stream; if ((stream = popen("gnuplot", "w")) == NULL) perror("popen() failed"); else fprintf(stream, "plot sin(x)\n"); ... pclose(stream);
Beide Lösungen, pipe() und popen(), findest du ausführlich mit Beispielen in "C und Linux" beschrieben.
Martin
-
vielen dank,
die zweite Lösung reicht mir völlig, da sich das Programm nur akkustisch zurückmeldet. Es funktioniert eigentlich auch, bis auf eine Kleinigkeit.
Das Programm arbeitet die übergebenen Befehle erst ab, wenn der stream mit pclose geschlossen wird.
Normalerweise wird ja jeder Befehl mit Enter bestätigt, aber wenn ich \n oder \r an den string anhänge hilft das leider gar nichts.
-
hab es jetzt mit fflush hinbekommen
danke noch mal