# Rückgabe von system()



## muehle (22. März 2004)

Hallo

Ich wusste nicht genau wie ich den Titel dieser Frage schreiben sollte, also:

Mit dem Befehl "system()" kann man ja Befehle an den Komandointerpreter des Betriebsystems übergeben...
Nun starte ich dadurch ein anderes Programm, was mir Informationen auf dem Bildschirm ausgibt. Wie kann ich diese Informationen verarbeiten?

Beispiel:
system("netcat -w 2 pop.gmx.de 110")
Zeigt auf Bildschirm an: "+OK GMX POP3 StreamProxy ready ..."

Wie bekomme ich das was auf dem Bildschirm angezeigt wird in eine Variable, die ich weiterverarbeiten kann?

gruß
muehle


----------



## Kachelator (22. März 2004)

> Return Value
> 
> If command is NULL and the command interpreter is found, the function returns a nonzero value. If the command interpreter is not found, it returns 0 and sets errno to ENOENT. If command is not NULL, system returns the value that is returned by the command interpreter. It returns the value 0 only if the command interpreter returns the value 0. A return value of – 1 indicates an error, and errno is set to one of the following values:
> [...]


So, wie es aussieht, kannst du direkt nur Fehlercodes bekommen. Wenn du ein Programm schreibst, gibt main() ja auch nur ints zurück. 
Falls du auf den Bildschirmspeicher der Konsole zugreifen willst - vielleicht geht es mit GetConsoleScreenBufferInfo() usw. Habe es allerdings selbst noch nie probiert.


----------



## muehle (22. März 2004)

Hi!

genau, die die funktion "system" gibt nur zurück ob der Befehl ausgeführt werden konnte...

eine Idee die mir noch kam ist:
system("netcat -w 2 pop.gmx.net 110 > datei.txt")
und dann per programmcode diese datei.txt auslesen, aber das scheint mir doch etwas unprofessionell, oder?

gruß
muehle


----------



## Kachelator (22. März 2004)

Nee, eigentlich ist die Idee genial. Das solltest du probieren!


----------



## muehle (22. März 2004)

Hi!

ok, dann muss ich wohl mal an der lösung weiter arbeiten...

noch ne frage... so ein Tutorial oder ne Referenz wie http://www.php.net gibt es nicht für c++, oder?
zumindest habe ich noch nichts in die Richtung beim googeln entdeckt...


----------



## Kachelator (22. März 2004)

Such mal hier im Forum (Button oben). Die Frage ist nämlich schon oft gestellt worden. Hm, such mal nach "C++ in 21 Tagen" oder so.


----------



## muehle (22. März 2004)

danke!


----------



## hulmel (23. März 2004)

> Mit dem Befehl "system()" kann man ja Befehle an den Komandointerpreter des Betriebsystems übergeben...
> Nun starte ich dadurch ein anderes Programm, was mir Informationen auf dem Bildschirm ausgibt. Wie kann ich diese Informationen verarbeiten?


Mit popen().


----------



## Kachelator (23. März 2004)

Sehr gut, das scheint Arbeit zu sparen. Gibt es das übrigens auch für Windows?


----------



## Daniel Toplak (23. März 2004)

> Sehr gut, das scheint Arbeit zu sparen. Gibt es das übrigens auch für Windows?


Ja gibt es.
Zur Erklärung:
Damit wird eine *einseitige* Pipe geöffnet, somit kann man entweder von stdin die Rückgaben eines Programms, das nach stdout schreib lesen.
Oder über stdout rauschreiben, damit ein anderes Programm von stdin lesen kann.

Gruß Homer


----------



## muehle (26. März 2004)

hallo

danke für die Idee mit popen()

Tja, ich bin mit c++ immernoch auf Kriegsfuß....

meine Idee:

char *test;

test =  popen("(echo user mailadresee@gmx.net;echo pass passwort;sleep 2;echo stat;echo quit) | netcat -w 2 pop.gmx.de 110", "w");

aber deim compilieren sagt er mir schon: 
"cannot covert 'FILE*' to 'char*' in assignment"

ich vermute mal irgendwas stimmt mit dem zurückgegebenen Datentyp nicht...
Damit hab ich sowiso probleme...

Die zurückgegebenen "Zeilen" müsste ich durchsuchen und bestimmte Teile in Variablen speichern, die ich später weiterverarbeiten will. Na, ja, dann hacks schon wie ich eine bestimmte Zeichenkette suche. mit "substr" bin ich wegen den Datentypen auch nicht weit gekommen...


----------



## muehle (26. März 2004)

ok... ich glaube ich habe mich eben schon wieder etwas weitergebracht....

ich muss popen mit dateioperationen weiterverarbeiten


----------



## MAN (26. April 2004)

Hallo,

bin auch schwer am überlegen, wie ich die Konsolenausgabe in mein Programm einlese.



> Mit popen().



Das habe ich auch probiert, doch scheinbar ist das nur für UNIX-Systeme, kann das sein? Ich hatte nämlich noch die Datei "pipestream.h" includiert (die man dafür glaub ich noch brauch) aber funktioniert trotzdem nicht, da er diese Datei nicht kennt.

Gibt es da auch eine gute Möglichkeit für Windows?


mfG

MAN


----------



## Deshoax (20. Februar 2010)

Ja gibt es, http://msdn.microsoft.com/en-us/library/96ayss4b(VS.80).aspx

Die Funktion unter Windows nennt sich _popen


----------

