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


Anmelden zum Antworten