Ext. Programm ausführen und Standardausgabe speichern ?



  • Und hier nochmal die Originalquelle:

    http://www.ecst.csuchico.edu/~beej/guide/ipc/



  • Also zunächst mal: Das System ist Solaris 8
    Ich tendiere dazu, dass das eigentlich genau das ist, was ich meinte (nur dass es mir vielleicht doch ein bisschen hoch ist).

    Ich hab´ mir übrigens in der Zwischenzeit eine Lösung mit Files gebastelt (für mich gar nicht so einfach)...
    -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --

    system("echo \"Hallo Welt\" > tmpfile");
            FILE *ftmp;
            char chrtmp[1]="";
            char chrout[50]="";
    	int c;
    	ftmp = fopen("tmpfile","r");
    	while ((c = fgetc(ftmp)) != EOF)
    	{
    		sprintf(chrtmp,"%c",c);
    		if(c!='\n') {strcat(chrout , chrtmp); };
    	}
    	printf(">%s<",chrout);
    	fclose(ftmp);
    

    -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --

    Ich hatte eigentlich gehofft, dass das schon etwas einfacher zu bewerkstelligen ist - ich befürchte, da muss ich bei meiner umständlichen aber für mich verständlichen Vorgehensweise bleiben... ;o(



  • PS: Verbesserungsvorschläge natürlich weiterhin jederzeit willkommen... 😉



  • wie someone schon angedeutet hat, könntest du mit man: popen() eine Pipe öffnen (anstelle von system()) und die Ausgaben des aufgerufenen Programms in einen eigenen FILE* umleiten:

    FILE* pdata = popen("echo \"Hallo Welt\"","r");
    char out[51];
    while(fgets(out,50,pdata)!=NULL)
      printf(">%s<",out);
    pclose(pdata);
    

    (btw, dein Umgang mit dem Speicher ist imho bedenklich)



  • Wow! Das gefällt mir supergut! 🙂 Genau was ich brauche.
    Da sag´ ich schon mal danke für...

    Inwiefern findest Du das bedenklich? (und mit dieser Frage will ich bestimmt nicht abstreiten, dass es das nicht ist 😉 😉 )



  • Du hast ein 50 Zeichen großes Array angelegt und vergisst dann zu überprüfen, weiviel du schon eingelesen hast. Und das Array char chrtmp[1]=""; ist aus zu klein, um ein Zeichen UND den Null-Terminator unterzubringen - mit dem Ergebnis, daß die strcat()-Anwendung undefiniertes Verhalten liefert.



  • OK, allerbesten Dank noch einmal!
    Mein Tag ist gerettet! 👍



  • Darf ich vielleicht doch noch einmal aufdringlicher Weise eine kleine Frage dazu stellen?

    In "out" habe ich jetzt einen string aus 4 Zeichen stehen - z.B. "a1cd".
    Wie kann ich denn feststellen, ob der zweite Character eine "1" oder eine "0" ist?

    Bisher habe ich sowas immer mit strtok gemacht, aber da hatte ich auch vernünftige Trennzeichen...



  • Im einfachsten Fall vergleichst du die Zeichen mit deinen Wunschwerten (an die einzelnen Elemente des Strings kommst du über Index-Zugriff):

    if(out[1]=='1')//Die Zählung beginnt bei 0, deshalb ist out[1] das zweite Zeichen
      printf("1 gefunden");
    


  • 😃 Nochmal danke - und jetzt halte mich wieder etwas zurück... 😉



  • Auch von mir ein riesen Dank :D.
    Hat auch meinen Tag gerettet.



  • der thread ist zwar schon ziemlich alt, aber ich habe da noch eine frage zu.
    Wie kann ich bei dem befehl execlp sagen, in welchem verzeichnis der befehl ausgeführt werden soll?
    und wie kann ich das codebeispiel mit den 2 threads in windows umsetzen?

    danke
    scosu



  • scosu schrieb:

    der thread ist zwar schon ziemlich alt, aber ich habe da noch eine frage zu.
    Wie kann ich bei dem befehl execlp sagen, in welchem verzeichnis der befehl ausgeführt werden soll?

    Indem du den kompletten Pfad übergibst.

    scosu schrieb:

    und wie kann ich das codebeispiel mit den 2 threads in windows umsetzen?

    danke
    scosu

    Indem du WinApi Funktionen verwedest, die einen Thread starten ( CreateThread ).



  • danke für deine antwort

    wie läuft das denn mit den pipes, dem lesen von der pipe und das umbiegen des standardoutputs?

    also habe hier eine server binary und die öffnet relativ zu dem ausführungspfad daten die sie braucht. aber ich weiß nicht wie man es schafft, dass die datei in dem gleichen ordner ausgeführt werden, sodass auch die relativen pfadangaben passen.


Anmelden zum Antworten