andere Programme in c++ ausführen ...
Hi, ich habe an der Uni bisher nur Java programmiert und bekomme leider dies in c++ nicht hin ... vielleicht kann mir ein crack von Euch mal eine kleine Methode schreiben, damit ich ein Beispiel habe um dies zu verstehen ... Ich benötige eine Methode wie: z.B.: s="cdrecord dev=1,1,0 -v xyz.iso"; string[] fuehreProgrammAus (string s); Diese soll den Befehl befehl in der Shell ausführen (in dem Verzeichnis in dem mein Programm gestartet wurde. Aber jetzt kommt das weit größere Problem: in string[0] soll der output von dem ausgeführten Programm stehen und in s[1] der error output. Würde mir da mal einer von Euch kurz helfen? tia OLI PS: ein fork() ist nicht nötig ... mein Programm wartet eh auf den Output des anderen ...
Am Dienstag, 2. März 2004 17:52 schrieb Tim Oliver Wagner:
Hi, ich habe an der Uni bisher nur Java programmiert und bekomme leider dies in c++ nicht hin ... vielleicht kann mir ein crack von Euch mal eine kleine Methode schreiben
vielleicht nützt dir system (); was. Dürfte normales C sein und ich weiß nicht,ob es wirklich das ist, was Du gesucht hast. Aber auf jedenfall HTH! MfG Frank Lanitz
Am Dienstag, 2. März 2004 21:57 schrieb Frank Lanitz:
Am Dienstag, 2. März 2004 17:52 schrieb Tim Oliver Wagner:
Hi, ich habe an der Uni bisher nur Java programmiert und bekomme leider dies in c++ nicht hin ... vielleicht kann mir ein crack von Euch mal eine kleine Methode schreiben
vielleicht nützt dir system (); was. Dürfte normales C sein und ich weiß nicht,ob es wirklich das ist, was Du gesucht hast. Aber auf jedenfall HTH!
Wohl eher nicht - da kommen stdout und stderr nämlich nicht an. IMHO geht sowas nur über dup2(), pipe(), fork() und exec(). Wenn nur stdout gefragt wäre, könnte man die Ausgaben mit popen() kriegen, aber dann fehlt immer noch stderr (eine Umleitung mit 2>&1 im Kommando hilft auch nicht wirklich, es sei denn, man kann die Meldungen im Text unterscheiden und dann parsen). Jan
On Tuesday 02 March 2004 23:45, Jan Trippler wrote:
Wohl eher nicht - da kommen stdout und stderr nämlich nicht an. IMHO geht sowas nur über dup2(), pipe(), fork() und exec().
Wenn nur stdout gefragt wäre, könnte man die Ausgaben mit popen() kriegen, aber dann fehlt immer noch stderr (eine Umleitung mit 2>&1 im Kommando hilft auch nicht wirklich, es sei denn, man kann die Meldungen im Text unterscheiden und dann parsen).
popen() ist nur ein sehr dünner Wrapper um fork()/exec()/pipe() - für den
Normalfall, nämlich daß man nicht stderr und stdout des gestarteten Programms
getrennt umleiten will. Wenn man das doch will, muß man eben selber das tun,
was popen() auch tut - und eben mit (low-level) pipe() stderr auf einen
anderen File-Deskriptor umleiten.
Siehe "man pipe".
CU
--
Stefan Hundhammer
Am Mi, 2004-03-03 um 11.21 schrieb Stefan Hundhammer:
On Tuesday 02 March 2004 23:45, Jan Trippler wrote: popen() ist nur ein sehr dünner Wrapper um fork()/exec()/pipe() - für den Normalfall, nämlich daß man nicht stderr und stdout des gestarteten Programms getrennt umleiten will. Wenn man das doch will, muß man eben selber das tun, was popen() auch tut - und eben mit (low-level) pipe() stderr auf einen anderen File-Deskriptor umleiten.
Siehe "man pipe".
Hi, ich habe jetzt wieder eine ganze Weile versucht solch ein Programm zu schreiben. Es ist erstmal auch nicht wichtig ob die Information auf dem stderr oder stdout reinkommt ... das könnte ruhig zusammengemischt sein. Leider schaffe ich es nicht solch ein Program zu programmieren. Könnte nicht jemand mal ein kleines Beispielprogramm schreiben, dass z.B. folgen Befehl ausführt $ tcprobe -i /dev/dvd -T 1 und der output in einem String auffängt. Ich hoffe es hat jemand etwas Zeit dies mal zu machen. tia OLI PS: Unter Java war das immer schön, da konnte man alles in der API finden ... hier in c++ gibt es leider keine vernünftige Beschreibung der Klassen und Methoden ... oder ich habe diese noch nicht gefunden. :-(
Hallo Tim!
ich habe jetzt wieder eine ganze Weile versucht solch ein Programm zu schreiben. Es ist erstmal auch nicht wichtig ob die Information auf dem stderr oder stdout reinkommt ... das könnte ruhig zusammengemischt sein.
Leider schaffe ich es nicht solch ein Program zu programmieren.
Könnte nicht jemand mal ein kleines Beispielprogramm schreiben, dass z.B. folgen Befehl ausführt
$ tcprobe -i /dev/dvd -T 1
und der output in einem String auffängt.
Ich hoffe es hat jemand etwas Zeit dies mal zu machen.
tia
OLI
PS: Unter Java war das immer schön, da konnte man alles in der API finden ... hier in c++ gibt es leider keine vernünftige Beschreibung der Klassen und Methoden ... oder ich habe diese noch nicht gefunden. :-(
Die Zeit, jetzt mal eben ein solches Programm zusammenzubasteln, habe ich leider nicht, aber vielleicht noch zwei Hinweise: 1. Wenn Du die Möglichkeit hast, die Qt-Bibliothek zu benutzen, dann bietet Dir die darin enthaltene QProcess-Klasse das C++-API, das Du suchst. Die Dokumentation dieser Bibliothek ist auch sehr ausführlich, und damit kommst Du, denke ich, sehr schnell an Dein Ziel. Nebenbei bekommst Du dann auch noch Code, der mit hoher Wahrscheinlichkeit ohne große Änderungen auch unter Windows lauffähig ist. 2. Darüberhinaus würde ich Dir auf jeden Fall raten, Dich dennoch eingehender mit den Unix-Systemrufen zu beschäftigen, die hier bereits erwähnt wurden (fork(), exec(), ...). Denn die haben nicht primär etwas mit C++ zu tun, sondern sind ein C-API. Wenn Du dazu mehr und vielleicht auch verständlichere Informationen suchst als Du sie in den entsprechenden Man-Pages finden kannst, dann lege ich Dir folgendes Buch ans Herz: W. Richard Stevens "Programmierung in der Unix-Umgebung" Erschienen bei Addison-Wesley ISBN 0-201-56317-1 Darin findest Du nahezu alles, was man über Unix-Programmierung wissen sollte, erklärt - ein ideales Nachschlagewerk. Die oben genannte Ausgabe ist die deutschsprachige Ausgabe, die, wie ich finde, ziemlich gut ist. Ich hoffe, das hilft Dir ein bißchen weiter. Herzliche Grüße, Alex. -- Wer fragt, ist ein Narr für fünf Minuten. Wer nicht fragt, bleibt es für immer. (chinesisches Sprichwort) --------------------------------------------------------------------- Alexander Glintschert Das andere Berlin Email: alex@glintschert.de Email: info@anderes-berlin.de WWW: http://www.glintschert.de WWW: http://www.anderes-berlin.de ICQ: 43854124 ->Das andere Berlin - Was nicht jeder Reiseführer weiß - und mancher Berliner auch nicht.
Am 3837. September 1993 schrieb Tim Oliver Wagner:
Unter Java war das immer schön, da konnte man alles in der API finden
Und für C kannst Du alles in APUE finden. : )
ich habe jetzt wieder eine ganze Weile versucht solch ein Programm zu schreiben. [...] Leider schaffe ich es nicht solch ein Program zu programmieren.
Hier wollte ich Beispielcode einfügen den ich ohnehin hatte, weil ich letztens einen Kollegen beschlauen musste. Nachdem ich Deine Site gesehen habe weiß ich aber, daß ich den Code unmöglich selbst entwickelt haben kann und überdies dringend in der Küche erwartet werde. ; )
Aber jetzt kommt das weit größere Problem: in string[0] soll der output von dem ausgeführten Programm stehen und in s[1] der error output.
Würde mir da mal einer von Euch kurz helfen?
Ich habe das vor ein paar Jahren mal selbst längere Zeit ausprobiert und schicke dir per PM mal das Programm, das dabei herauskam. Es ruft ein beliebiges anderes Programm auf und schreibt den Output in die beiden Dateien stdout.txt und stderr.txt. Aber das kann man natürlich ändern, in der Form, das die Ausgabedateien beliebige andere Namen erhalten. Gruß Joachim
participants (7)
-
Alexander Glintschert
-
Cristalle Azundris Sabon
-
Frank Lanitz
-
Jan.Trippler@t-online.de
-
Joachim Weber
-
Stefan Hundhammer
-
Tim Oliver Wagner