El comando chdir es un shell integrado, por lo que tiene acceso directo al directorio de trabajo del shell que lo ejecuta. Los shells suelen ser bastante buenos para protegerse de los efectos de los scripts, dando al proceso secundario una copia del propio entorno de trabajo del shell. Cuando el proceso hijo sale, el entorno que utilizó se elimina.
Una cosa que puede hacer es 'obtener' un script. Esto le permite cambiar el directorio porque, en esencia, le está diciendo al shell que ejecute los comandos del archivo como si los hubiera escrito directamente. Es decir, no está trabajando desde una copia del entorno del shell, está trabajando directamente en él, al realizar el abastecimiento.
No existe una forma "legal" de influir en el directorio actual del proceso principal, aparte de pedirle al proceso principal que lo cambie por sí mismo.
chdir
que cambia el directorio en bash scripts no es una utilidad externa, es un comando integrado.
No hagas esto.
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);
Será probablemente funciona, aunque ten en cuenta que el pwd
de Bash el comando se almacena en caché y no se notará.