2016-08-18 1 views
0

Ich versuche, eine C++ - Anwendung (unter Linux) aus einem anderen Verzeichnis auszuführen. Die App soll einige Dateien in dem Verzeichnis lesen, in dem sie sich befindet. Starten Sie ein C++ - Programm aus einem anderen Verzeichnis (unter Linux)

/opt/app/proj/ 

Alle Dateien Nehmen wir an, die ausführbare Datei in

ist von der App sind im gleichen Verzeichnis zu lesen, wenn ich den Code aus diesem Verzeichnis ausführen, alles läuft gut. aber wenn ich in /home/user/File/ und führen Sie den Code

/opt/app/proj/application 

finden, dass die Dateien nicht !! in meinem C++ Code Ich habe so etwas wie das hinzugefügt:

string cwd(get_current_dir_name()); 
string path(argv[0]); 
string CONFIG_FILE = "configuration.conf"; 
string FILETYPES = "extensions.txt"; 

int pos = path.find("./"); 
if(pos>=0){ 
    path = cwd+path.substr(pos+1, path.length()-1); 
} 
pos  = path.find_last_of("/"); 
path = path.substr(0,pos+1); 
CONFIG_FILE = path + CONFIG_FILE; 
FILETYPES = path + FILETYPES; 

Es ist immer noch nicht funktioniert .. Benötigen Sie Hilfe bei ...

+0

Was ist 'CONFIG_FILE'? Welche Variable verwendest du? Mehr Code mehr Deklarationen. – Blacktempel

+0

Drucken Sie alle Pfade in Ihrer App und prüfen Sie, ob die Pfade, die Sie formulieren, korrekt sind. Verwenden Sie cout zum Drucken oder gdb zum Debuggen. – Ravi

+0

Hallo CONFIG_FILE und FILETYPES sind nur zwei Strings, die Dateinamen definieren Ich habe gerade meine Frage bearbeitet. Entschuldigung für das Missverständnis – PhoenixBlue

Antwort

0

Vielen Dank für Ihre Eingabe. Eigentlich funktionierte mein Code, nur dass ich versuchte, von der Konfigurationsdatei zu lesen, bevor ich diesen Prozess oben ausführte. Mein Fehler. Trotzdem habe ich versucht, sich Ihre Vorschläge anzuschauen, um mehr über C-Programmierung zu erfahren. Danke nochmal!

0

einen neuen Prozess unter Linux starten wird, grob, ein zweistufiger Prozess :

  1. Die fork() Systemaufruf.

  2. Der untergeordnete Prozess führt den Systemaufruf exec() aus.

Um den neuen Prozess aus einem anderen Verzeichnis zu starten, müssen nur das Kind Prozess chdir() in das Verzeichnis, bevor den exec() Systemaufruf ausgeführt wird.

Wenn Sie system() verwenden, können Sie es ersetzen mit fork() + exec(), dies zu tun, oder da system() die Shell ausführt, um tatsächlich den Befehl ausführen, können Sie manuell die „chdir“ -Befehl voranstellen, obwohl dies weniger ist reinigen.

+0

Bitte erwähnen Sie 'system()' nicht - es ist ein Sicherheitsalbtraum. –

0

Wenn Sie den Pfad zu Ihrer ausführbaren Datei finden müssen, lesen Sie einfach die /proc/self/exe Symlink, dann können Sie dirname() oder basename() auf, dass zu dem Verzeichnis und dann chdir() an dieser Stelle und auf Ihre Dateien zugreifen, als ob Sie waren dort angefangen.

0

Um Ihre Fragen direkt zu beantworten, ist das Arbeitsverzeichnis für Linux das Verzeichnis, in dem die ausführbare Datei gestartet wurde, nicht wo sie sich befindet. Wie bereits erwähnt, können Sie mit readlink den Pfad von/proc/self/exe beziehen. Sie können dann den vollständig qualifizierten Pfad verwenden, um andere interessante Dateien zu finden. Here sind einige Details und Beispiele.

Im Allgemeinen würde ich diesen Ansatz nicht empfehlen. Die zwei Ansätze, die ich häufig verwende, sind:

  1. Starten Sie immer die Programme von einem bestimmten relativen Verzeichnis. Zum Beispiel wird [variabler Pfad]/bin der Startpunkt sein. Verwenden Sie relative Pfade in der ausführbaren Datei, um andere Dateien zu finden. Das Verzeichnis ../log for logs, ../conf enthält Konfigurationsdateien und so weiter. Wenn die ausführbare Datei nicht von der richtigen Stelle aus gestartet wird, wird sie sofort beim Öffnen einer Datei aus der Datei entfernt. Dieser Ansatz hat den Vorteil, relative Pfade zu verwenden, so dass der Wechsel zu einem neuen Stamm einfach ist.
  2. Übergeben Sie die Konfigurationsdatei als Befehlszeilenparameter oder env-Variable. Die Konfigurationsdatei enthält vollständige Details zu anderen interessanten Dateien, ohne auf den relativen Startpunkt der ausführbaren Datei Bezug zu nehmen.Die Binärdatei beginnt von überall und die Konfigurationsdatei enthält alle Details. Wenn die Konfigurationsdatei eine Reihe von fest codierten Pfaden enthält, kann dieser Ansatz sehr mühsam sein, wenn ein neuer Root benötigt wird. Ein guter Ansatz besteht darin, eine ROOT-Variable zu definieren, z. ROOT =/home/mfisher/project und dann andere Pfade relativ dazu z. BIN = $ ROOT/bin
Verwandte Themen