Hallo, ich habe momentan ein Problem mit einem selbst erstellen C++-Programm, wo ich momentan nicht richtig weiter komme (). Es geht um den system()-Aufruf, um aus dem Programm heraus eine anderen Befehl auszuführen. Das ganze passiert in einer Schleife, wo mehrere Aufrufe nacheinander erfolgen.
sprintf(Cmd,"echo \"convert %s_.ppm %s.jpg\" >> test",BaseFileName,BaseFileName); system(Cmd);
Das Problem ist, daß der Aufruf genau 8 mal korrekt gemacht wird (Rückgabe 0), und alle weitere Aufrufe schlagen fehl (Rückgabe -1). Das Ganze passiert nur in der Komplexität des gesamten Programms (wo ich nicht näher 'dauf eingehen will, da zu kompliziert. Grob geht es um eine Mandelbrot-Bildergallerie, wo auch die Bildparameter per GMP rekursiv verarbeitet werden, um einen klickbaren Zoom zu bekommen). Mach ich eine einfache for()-Schleife funktioniert das problemlos. Das Problem muß also mit dem Geraffel darum zusammen hängen. Um überhaupt einen Ansatzpunkt zu bekommen, versuche ich heraus zu bekommen, welcher Fehler bei dem system()-Aufruf passiert. Die Auswertung von 'errno' liefert -12, was 'out of memory' bedeutet, sofern errno überhaupt durch system() gesetzt wird. Kann ich mir aber nicht vorstellen, die Kiste hat 8Gb und es läuft nichts speicherfressendes (kinfocenter zeigt 73% freier physischer Speicher an). system ist Suse 13.1/64, letztes Onlineupdate eben gerade, g++ ist
g++ (SUSE Linux) 4.8.1 20130909 [gcc-4_8-branch revision 202388]
Was kann ich machen, um dem Fehler aus die Spur zu kommen ? -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um den Listen Administrator zu erreichen, schicken Sie eine Mail an: opensuse-de+owner@opensuse.org
Hallo Jürgen, helfen kann ich dir da leider nicht, habe nur ein paar Anmerkungen dazu Am 13.12.2014 um 18:59 schrieb Jürgen Hochwald:
Hallo,
ich habe momentan ein Problem mit einem selbst erstellen C++-Programm, wo ich momentan nicht richtig weiter komme ().
Es geht um den system()-Aufruf, um aus dem Programm heraus eine anderen Befehl auszuführen. Das ganze passiert in einer Schleife, wo mehrere Aufrufe nacheinander erfolgen.
sprintf(Cmd,"echo \"convert %s_.ppm %s.jpg\" >> test",BaseFileName,BaseFileName); system(Cmd);
Das Problem ist, daß der Aufruf genau 8 mal korrekt gemacht wird (Rückgabe 0), und alle weitere Aufrufe schlagen fehl (Rückgabe -1). Das Wird der Aufruf eigentlich ausgeführt und ist nur der Returnwert falsch oder scheitert der Aufruf komplett.
Ich frage deshalb, weil mich selber ne ganze Weile der system() Aufruf bei einem anderen Programm (XBMC, jetzt KODI) genervt hat. Der Aufruf brachte stets einen Fehler, obwohl das externe Programm (in diesem Fall ein Bash-Skript) korrekt ausgeführt wurde. Mittlerweile brauche ich diesen Teil nicht mehr, deshalb hab ich das nicht weiter verfolgt. Hinzu kommt, dass meine Kenntnisse in C++ Programmierung nicht gerade berauschend sind :-(
Ganze passiert nur in der Komplexität des gesamten Programms (wo ich nicht näher 'dauf eingehen will, da zu kompliziert. Grob geht es um eine Mandelbrot-Bildergallerie, wo auch die Bildparameter per GMP rekursiv verarbeitet werden, um einen klickbaren Zoom zu bekommen). Mach ich eine einfache for()-Schleife funktioniert das problemlos. Das Problem muß also mit dem Geraffel darum zusammen hängen. Tja, da wirst Du dann wohl auch keine weitere Hilfe hier bekommen
Um überhaupt einen Ansatzpunkt zu bekommen, versuche ich heraus zu bekommen, welcher Fehler bei dem system()-Aufruf passiert. Die Auswertung von 'errno' liefert -12, was 'out of memory' bedeutet, sofern errno überhaupt durch system() gesetzt wird. Kann ich mir aber nicht vorstellen, die Kiste hat 8Gb und es läuft nichts speicherfressendes (kinfocenter zeigt 73% freier physischer Speicher an).
man system sagt auch nix über gesetzte errno Variablen Ich hab da mal einem anderen Forum folgende Aussage gesehen "Ansonsten gilt: wenn möglich, nie system verwenden, sondern die Sache mit Linux-Systemaufrufen erledigen...", allerdings wurde nicht begründet warum Gruß Manfred -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um den Listen Administrator zu erreichen, schicken Sie eine Mail an: opensuse-de+owner@opensuse.org
Am 13.12.2014 um 20:31 schrieb Manfred Kreisl:
Hallo Jürgen,
....
sprintf(Cmd,"echo \"convert %s_.ppm %s.jpg\" >> test",BaseFileName,BaseFileName); system(Cmd);
Das Problem ist, daß der Aufruf genau 8 mal korrekt gemacht wird (Rückgabe 0), und alle weitere Aufrufe schlagen fehl (Rückgabe -1). Das Wird der Aufruf eigentlich ausgeführt und ist nur der Returnwert falsch oder scheitert der Aufruf komplett. Nein, da wird im Fehlerfall auch nichts aufgerufen. Weder der 'convert' (der eigentlich mit dem system()-Aufruf erfolgen soll), noch das Schreiben in die Textdatei per echo. Es werden die die ersten 8 Aufrufe gemacht, habe also 8 Zeilen in der Datei. Es mußten aber über 100 sein.
....
Ich hab da mal einem anderen Forum folgende Aussage gesehen "Ansonsten gilt: wenn möglich, nie system verwenden, sondern die Sache mit Linux-Systemaufrufen erledigen...", allerdings wurde nicht begründet warum
Ich habe auch mit execl() probiert. Das funktioniert, allerdings nur einmal, da es den laufenden Prozeß (im Erfolgsfall) beendet. So verstehe auch das auch aus der man-Page. Welche Alternative gäbe es noch zu system() ?
Gruß Manfred
Jürgen -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um den Listen Administrator zu erreichen, schicken Sie eine Mail an: opensuse-de+owner@opensuse.org
Am 13.12.2014 um 21:08 schrieb Jürgen Hochwald:
Am 13.12.2014 um 20:31 schrieb Manfred Kreisl:
Hallo Jürgen,
....
sprintf(Cmd,"echo \"convert %s_.ppm %s.jpg\" >> test",BaseFileName,BaseFileName); system(Cmd);
Das Problem ist, daß der Aufruf genau 8 mal korrekt gemacht wird (Rückgabe 0), und alle weitere Aufrufe schlagen fehl (Rückgabe -1). Das Wird der Aufruf eigentlich ausgeführt und ist nur der Returnwert falsch oder scheitert der Aufruf komplett. Nein, da wird im Fehlerfall auch nichts aufgerufen. Weder der 'convert' (der eigentlich mit dem system()-Aufruf erfolgen soll), noch das Schreiben in die Textdatei per echo. Es werden die die ersten 8 Aufrufe gemacht, habe also 8 Zeilen in der Datei. Es mußten aber über 100 sein.
....
Ich hab da mal einem anderen Forum folgende Aussage gesehen "Ansonsten gilt: wenn möglich, nie system verwenden, sondern die Sache mit Linux-Systemaufrufen erledigen...", allerdings wurde nicht begründet warum
Ich habe auch mit execl() probiert. Das funktioniert, allerdings nur einmal, da es den laufenden Prozeß (im Erfolgsfall) beendet. So verstehe auch das auch aus der man-Page.
Welche Alternative gäbe es noch zu system() ? Bastelarbeit ist da wohl angesagt, siehe beispielsweise hier: http://stackoverflow.com/questions/3055924/problems-with-system-calls-in-lin...
Gruß Manfred -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um den Listen Administrator zu erreichen, schicken Sie eine Mail an: opensuse-de+owner@opensuse.org
Hallo. On Saturday 13 December 2014 18:59:11 Jürgen Hochwald wrote:
Hallo,
ich habe momentan ein Problem mit einem selbst erstellen C++-Programm, wo ich momentan nicht richtig weiter komme ().
Es geht um den system()-Aufruf, um aus dem Programm heraus eine anderen Befehl auszuführen. Das ganze passiert in einer Schleife, wo mehrere Aufrufe nacheinander erfolgen.
sprintf(Cmd,"echo \"convert %s_.ppm %s.jpg\" >>
test",BaseFileName,BaseFileName);
system(Cmd);
Das Problem ist, daß der Aufruf genau 8 mal korrekt gemacht wird (Rückgabe 0), und alle weitere Aufrufe schlagen fehl (Rückgabe -1).
Das schreit doch geradezu nach einem Debugger - stimmen die spaeteren Kommandozeilen, die du an system() uebergibst, ueberhaupt noch?
Das Ganze passiert nur in der Komplexität des gesamten Programms (wo ich nicht näher 'dauf eingehen will, da zu kompliziert. Grob geht es um eine Mandelbrot-Bildergallerie, wo auch die Bildparameter per GMP rekursiv verarbeitet werden, um einen klickbaren Zoom zu bekommen).
Bildverarbeitung rekursiv??? Da laeuten bei mir die Alarmglocken. Stack overflow?
Mach ich eine einfache for()-Schleife funktioniert das problemlos. Das Problem muß also mit dem Geraffel darum zusammen hängen.
Um überhaupt einen Ansatzpunkt zu bekommen, versuche ich heraus zu bekommen, welcher Fehler bei dem system()-Aufruf passiert. Die Auswertung von 'errno' liefert -12, was 'out of memory' bedeutet, sofern errno überhaupt durch system() gesetzt wird. Kann ich mir aber nicht vorstellen, die Kiste hat 8Gb und es läuft nichts speicherfressendes (kinfocenter zeigt 73% freier physischer Speicher an).
system ist Suse 13.1/64, letztes Onlineupdate eben gerade, g++ ist
g++ (SUSE Linux) 4.8.1 20130909 [gcc-4_8-branch revision 202388]
Was kann ich machen, um dem Fehler aus die Spur zu kommen ?
Viel Spass beim Debuggen und Gruss, Hartwig -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um den Listen Administrator zu erreichen, schicken Sie eine Mail an: opensuse-de+owner@opensuse.org
Am 13.12.2014 23:09, schrieb Hartwig Atrops:
Hallo.
On Saturday 13 December 2014 18:59:11 Jürgen Hochwald wrote:
Hallo,
ich habe momentan ein Problem mit einem selbst erstellen C++-Programm, wo ich momentan nicht richtig weiter komme ().
Es geht um den system()-Aufruf, um aus dem Programm heraus eine anderen Befehl auszuführen. Das ganze passiert in einer Schleife, wo mehrere Aufrufe nacheinander erfolgen.
sprintf(Cmd,"echo \"convert %s_.ppm %s.jpg\" >>
test",BaseFileName,BaseFileName);
system(Cmd);
Das Problem ist, daß der Aufruf genau 8 mal korrekt gemacht wird (Rückgabe 0), und alle weitere Aufrufe schlagen fehl (Rückgabe -1).
Das schreit doch geradezu nach einem Debugger - stimmen die spaeteren Kommandozeilen, die du an system() uebergibst, ueberhaupt noch?
Das Ganze passiert nur in der Komplexität des gesamten Programms (wo ich nicht näher 'dauf eingehen will, da zu kompliziert. Grob geht es um eine Mandelbrot-Bildergallerie, wo auch die Bildparameter per GMP rekursiv verarbeitet werden, um einen klickbaren Zoom zu bekommen).
Bildverarbeitung rekursiv??? Da laeuten bei mir die Alarmglocken. Stack overflow?
Mach ich eine einfache for()-Schleife funktioniert das problemlos. Das Problem muß also mit dem Geraffel darum zusammen hängen.
Um überhaupt einen Ansatzpunkt zu bekommen, versuche ich heraus zu bekommen, welcher Fehler bei dem system()-Aufruf passiert. Die Auswertung von 'errno' liefert -12, was 'out of memory' bedeutet, sofern errno überhaupt durch system() gesetzt wird. Kann ich mir aber nicht vorstellen, die Kiste hat 8Gb und es läuft nichts speicherfressendes (kinfocenter zeigt 73% freier physischer Speicher an).
system ist Suse 13.1/64, letztes Onlineupdate eben gerade, g++ ist
g++ (SUSE Linux) 4.8.1 20130909 [gcc-4_8-branch revision 202388]
Was kann ich machen, um dem Fehler aus die Spur zu kommen ?
Viel Spass beim Debuggen und Gruss,
Hartwig
Hi, convert kann je nach Bildgröße schon ganz schön was an RAM schlucken... AFAIK versucht es, die gesamte Operation im RAM zu erledigen. Ich würde eine Zwangspause zwischen die einzelnen Systemrufe legen, evt. gibt der Kernel einfach nur den Speicher nicht schnell genug wieder frei. sleep(1) wäre eine Möglichkeit, für kürzere Zeiten irgendeine sinnfreie Schleife oder was mit time()... cu jth -- www.teddylinx.de -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um den Listen Administrator zu erreichen, schicken Sie eine Mail an: opensuse-de+owner@opensuse.org
participants (4)
-
Hartwig Atrops
-
Joerg Thuemmler
-
Jürgen Hochwald
-
Manfred Kreisl