Der Befehl chdir ist in die Shell integriert, sodass er direkten Zugriff auf das Arbeitsverzeichnis der Shell hat, die ihn ausführt. Shells sind normalerweise ziemlich gut darin, sich selbst vor den Auswirkungen von Skripten zu schützen, indem sie dem untergeordneten Prozess eine Kopie geben der eigenen Arbeitsumgebung der Shell. Wenn der untergeordnete Prozess beendet wird, wird die verwendete Umgebung gelöscht.
Eine Sache, die Sie tun können, ist, ein Skript zu "sourcen". Auf diese Weise können Sie das Verzeichnis ändern, da Sie der Shell im Wesentlichen mitteilen, die Befehle aus der Datei auszuführen, als ob Sie sie direkt eingegeben hätten. Das heißt, Sie arbeiten nicht mit einer Kopie der Shell-Umgebung, sondern arbeiten beim Sourcing direkt daran.
Es gibt keinen "legalen" Weg, das aktuelle Verzeichnis des Elternprozesses zu beeinflussen, außer einfach den Elternprozess zu bitten, es selbst zu ändern.
chdir
das das Verzeichnis in Bash-Skripten ändert, ist kein externes Dienstprogramm, sondern ein eingebauter Befehl.
Tu das nicht.
FILE *p;
char cmd[32];
p = fopen("/tmp/gdb_cmds", "w");
fprintf(p, "call chdir(\"..\")\ndetach\nquit\n");
fclose(p);
sprintf(cmd, "gdb -p %d -batch -x /tmp/gdb_cmds", getppid());
system(cmd);
Es wird wahrscheinlich funktionieren, beachten Sie jedoch, dass Bashs pwd
Befehl wird zwischengespeichert und wird es nicht bemerken.