stdin und stdout an ein execv
-
Hallo,
ich möchte mir ein Programm schreiben, das Konsolenprogramme netzwerkfähig macht.
Ja, ich kenne den inetd. Das Problem bei diesem ist allerdings, dass er meines Wissens die Programme beim Request startet und anschließend wieder beendet. Ich möchte sie im Hintergrund am Laufen haben.Der Socket-Server ist eher weniger das Problem. er bekommt fröhlich Daten Gesendet und empfängt diese. Das Problem scheint zu sein, dass meine Daten nicht an das aufgerufene Programm weitergeleitet werden.
Hierzu erstelle ich in einem childprozess eine pipe() und verbinde sie mit stdin und stdout. Anschließend wird mein Programm gestartet.
Eigentlich sollte alles, was ich jetzt in die pipe-deskriptoren schreibe auch im Programm landen. tut's aber offensichtlich nicht. Nur weiß ich nicht warum und hab auch keine Ahnung, wie ich das debuggen könnte.
hier mal der Code./** * lade Programm, erstelle die io-pipe */ int create_program_fork(int *ios, char const *program) { // create pipes to program if (pipe(ios) != 0) { return -1; } // fork to new process int f = fork(); if (f < 0) { // fork didn't work close(ios[0]); close(ios[1]); return(-1); } if (f > 0) { // master hasn't much to do here return f; } // *** Child Process // close std** file descriptors printf ("executing program"); close(STDIN_FILENO); close(STDOUT_FILENO); // duplicate pipes as std** dup2(ios[0], STDIN_FILENO); dup2(ios[1], STDOUT_FILENO); // close pipes close(ios[0]); close(ios[1]); // call program return execvp(program, NULL ); } int main(int argc, char *argv[]) { int ios[2]; // call program int pid = create_program_fork(ios, "/bin/bash"); if (0 != pid){ exit(EXIT_FAILURE); } char const exit_order[] = "exit\0"; char const order[] = ">/tmp/test.txt\0"; // do something write(ios[1], order, strlen(order)); // bash should stop then.. write(ios[1], exit_order, strlen(exit_order)); return 0; }
kann mir wer erklären, was ich vergeigt hab?
-
die Pipe hat ein schreibe- und ein leseende für das was du machen willst brauchst du also zwei pipes eine für "hin" und eine für "zurück".
unten ist ein Beispiel mit einer pipe.
http://www.c-plusplus.net/forum/305816