Ausgaben einer Systemfunktion zur Laufzeit dauerhaft auslesen.



  • Folgendes Problem:
    Ich habe eine Systemfunktion wie etwa (nur als Beispiel)

    system("befehl -v >/tmp/tmp.txt")
    

    und möchte diese in einer Memberfunktion aufrufen. Da ich aber über eine Benutzeroberfläche sowas wie eine Statusanzige brauche, würde ich gerne die Ausgaben dort anzeigen lassen.
    Ich müsste also diese Funktion aufrufen und dann den Text dazu auslesen, soweit kein Problem, nur ändert sich ja nach dem Aufruf des Systemkommandos die Ausgabe laufend, und bin somit nicht uptodate weil ich ja nur einmalig zu einem bestimmten Zeitpunkt die Ausgaben nach dem Aufruf sinvoll auslesen kann. Wie kann ich eine laufende Ausgabe erreichen? Ich hoffe, das es so verständlich war?



  • Bist du sicher, dass du das Problem nicht mit API Funktionen lösen kannst? - system Aufrufe sind recht teuer:
    http://www.gidnetwork.com/b-61.html

    API Funktionen hingegen sind oftmals genug performant, um sie in Echtzeit aufzurufen. (sprich ein paar mal die Sekunde).



  • Ich bin mir eben nicht sicher, deshalb frag ich ja und würde gerne wissen wie man sowas am besten machen kann.



  • Ja. Was du dann machen willst, musst du uns schon offenbaren.. 😉



  • Windows: CreateProcess
    Linux: execlp

    Dann nur noch mittels Piping die Prozessausgabe von stdout, stderr umleiten fertig.



  • Ahh, das kommt schon näher ran. Soll für Linux sein, Danke.



  • Gern geschehen 🙂

    Für das Piping in Linux könnte das hier hilfreich sein.

    #include <iostream>
    #include <cstdio>
    #include <cstdlib>
    
    using namespace std;
    
    int main(int argc, char *argv[])
    {
    	pid_t nPid;
    	char page;
    	// Make pipe for communication between parent and child
    	int p[2];
    	if ( pipe( p ) != 0 )
    	{
    		perror( "pipe()" ); exit(255);
    	}
    
    	// fork() to get child process
    	nPid = fork();
    	if ( nPid < 0 )
    	{
    		perror( "fork()" );
    		exit(255);
    	}
    	else if ( nPid == 0 )
    	{
    		// CHILD PROCESS
    		close(p[0]);
    		if (p[1] != STDOUT_FILENO)
    		{
    			if (dup2(p[1], STDOUT_FILENO) != STDOUT_FILENO)
    			cerr << "dup2 error to stdout" << endl;
    			close(p[1]);
    		}
    		execlp( "wget", "wget", "--output-document","-","robots=off","-q","http://www.google.com", NULL);
    		exit(255);
    	}
    	else
    	{
    		// PARENT PROCESS
    		// put result from wget in var page;
    		cout << "page name to put result from wget is: \n" << page;
    		return(0);
    	}
    
    	//fflush( stdout );
    	return( 0 );
    }
    

Anmelden zum Antworten