C++: problem mit der "system" funktion
-
hallo, ich wollte ein kleinen installer basteln; ich weiß nicht ob ich das forum ganz richtig getroffen hab?! aber das hier ist so ein mix aus c/qt und linux-spezifisches etc.
void Form1::conf() { options = lineEdit_parameters->displayText(); target_path = lineEdit_path->displayText(); short pos = s_file.find(".tar" , 0); s_filepath = s_file.left(pos); system("cd " + s_filepath); //cd .. cout<<s_filepath<<endl; //log system("./configure"); }
ich hab da ein problem mit der system funktion. also cd scheint bei meinem prog nicht zu funktionieren, denn nach einem entpacken eines verzeichnisses, will ich diese funktion aufrufen und bekomm dimmer die meldung das er ":/configure" nich findet.
wie kann ich das problem beheben? ich hab schon an eine bash-datei gedacht. aber das ist auch wieder so ein "system"-müll, wie kann ich auf system ganz verzichten?
die guis die auf konsolen-apps aufsetzen, wie funktionieren die? kann man mit system eigentlich pipes nutzen?
-
Du könntest chdir() verwenden.
Dass deins nicht funktioniert, ist klar, denn es wird zuerst eine Shell gestartet, die das cd macht und sich danach beendet. Auf deinen Prozess wirkt sich das natürlich überhaupt nicht aus, und auch nicht auf die nachfolgende Shell.
-
exigoner schrieb:
system("cd " + s_filepath); //cd ..
davon abgesehen, dass die Lösung mit system total häßlich ist, ist das hier falsch, weil system ein char* erwartet und "cd " + s_filepath nicht das liefert, was du dir wünscht, denn + addiert die Adressen auf die s_filepath zeigt mit der Adresse, wo "cd " gespeichert ist; + fügt keine char*s zusammen.
char line[200]; line[0]=0; ... strcat(line, "cd "); strcat(line, s_filepath); system(line);
-
gut deine lösung zum zusammenfügen von strings ist schöner, aber wie könnte man das system ganz weglassen?
ich hab da noch keine idee, wie man konsolenbefehle ohne system ausführt.
-
Ringding hat dir doch ne Antwort gegeben.
Und abgesehen von system gibts noch die exec-Familie. Die hilft hier aber genausowenig.
-
Hallo,
also wenn Qt verwenden möchtest kannst du qprocess.h
einen Befehl in einer shell ausführen, unter kde geht das mit kprocess.h
einfach mal in der Doku schauen .
kleines BeispielKProcess *neuertask; neuertask = new KProcess; *neuertask << "mplayer meinfile"; neuertask->setUseShell(true, "/bin/sh");
gruß
central
-
Zur String-Concatenation: In C++ kann man z.B. mit der STL-String-Klasse durchaus den "+"-Operator verwenden. Das saehe dann so aus:
#include <unistd.h> #include <string> // ... typedef std::string String; // ... String file_path; file_path = "abcdefgh"; chdir( file_path.c_str() ); // oder, theoretisch: // system( ( "cd " + file_path ).c_str() ); // (was nix bringt, wie bereits gesagt wurde) system( "./configure" );
Uebrigens, wenn's nur um sowas geht, kannst Du auch ein Shell-Skript schreiben.
(gib mal "man sh" oder "info bash" ein).#!/bin/sh file_path = $1 # $1 = erster Programmparameter if [ -e $file_path ] # prueft, ob Verzeichnis existiert then cd $file_path ./configure else echo "Verzeichnis $file_path existiert nicht" fi
(Uebrigens, "chmod 755" auf das Skript nicht vergessen, damit es ausfuehrbar ist)
-
void Form1::conf() { options = lineEdit_parameters->displayText(); target_path = lineEdit_path->displayText(); short pos = s_file.find(".tar" , 0); s_filepath = s_file.left(pos); system("cd " + s_filepath); //cd .. cout<<s_filepath<<endl; //log system("./configure"); }
Ich nehme an, s_filepath ist von einem string-typ, welcher automatisch in ein const char* gecastet werden kann (sonst würde Dein Compiler ja meckern). Dann stimmt zunächst mal der system-Aufruf für cd. Nur daß dieser nicht das bewirkt, was Du möchtest. Der Aufruf erzeugt einen neuen Prozess. Und für diesen Prozess wird das aktuelle Verzeichnis gewechselt. Dann wird der Prozess beendet und das aktuelle Verzeichnis ist wieder wie vorher.
Also besser chdir(2) verwenden:chdir("cd " + s_filepath);
Tommi