2010-10-26 9 views
15

Duplicar posibles:
how to find the location of the executable in C¿Puede un ejecutable descubrir su propio camino? (Linux)

me gustaría un ejecutable para poder descubrir su propio camino; Tengo la sensación de que la respuesta es "no puedes hacer esto", pero me gustaría que esto se confirme.

No creo que pueda usar getcwd(), porque es posible que no lo esté ejecutando desde el mismo directorio. No creo que pueda usar argv[0], porque eso se basa en la cadena que se utiliza para ejecutarlo. ¿Hay más opciones?

Fundamento

El verdadero problema es que me gustaría hacer un ejecutable en algún lugar de un sistema de archivos, y colocar un archivo de configuración por defecto junto a él. Quiero que el ejecutable pueda leer su archivo de configuración en tiempo de ejecución, pero no quiero codificar esta ubicación en el ejecutable, ni quiero que el usuario tenga que establecer variables de entorno. Si hay una solución mejor a esta situación, soy todo oídos ...

+2

"Si hay una mejor solución para esta situación", Sí, haga lo que hace el resto del mundo, coloque el archivo de configuración dentro del directorio/etc. – Anders

+0

@Steve: Sí, la respuesta a esa pregunta es exactamente lo que estoy buscando. ¡Gracias! –

+0

es una respuesta modelo, me alegro de que haya ayudado –

Respuesta

27

El archivo/proc/self/exe es un enlace al ejecutable actualmente en ejecución.

+7

Este enlace simbólico debe leerse con readlink. – Aif

1

Bueno, tienes que usar getcwd() en conjunción con argv[0]. El primero te da el directorio de trabajo, el segundo te da la ubicación relativa del binario del directorio de trabajo (o una ruta absoluta).

+0

y por qué downvote este también? alguien está siendo cojo ... –

+2

No he votado negativamente, pero no creo que esto funcione. 'argv [0]' no es necesariamente relativo (considere ejecutar ejecutable desde la línea de comando como '/ blah/my_app'). –

+0

Programas para ejecutar no buscados en cwd, pero en $ PATH, hasta que especifique la ruta al ejecutable. – Vovanium

5

Uso del proc filesystem

Su flujo sería:

  • una EIP del ejecutable mirada
  • en /proc/PID/exe para un enlace simbólico
+0

¿por qué el voto a favor? y ¿por qué solo downvote mío cuando CodeninjaTim básicamente dice lo mismo? –

+5

No es necesario obtener el pid y manipular dinámicamente las cadenas. La cadena codificada '"/proc/self/exe "' es más simple y mejor. –

12

Usted puede utilizar getpid() para encontrar el pid del proceso actual, luego lea /proc/<pid>/cmdline (para un lector humano) o /proc/<pid>/exe que es un enlace simbólico al actu al programa. Luego, usando readlink(), puede encontrar la ruta completa del programa.

Aquí es una implementación en C:

#include <sys/types.h> 
#include <unistd.h> 
#include <sys/stat.h> 
#include <limits.h> 
#include <stdio.h> 

int main() 
{ 
    char path[PATH_MAX]; 
    char dest[PATH_MAX]; 
    memset(dest,0,sizeof(dest)); // readlink does not null terminate! 
    struct stat info; 
    pid_t pid = getpid(); 
    sprintf(path, "/proc/%d/exe", pid); 
    if (readlink(path, dest, PATH_MAX) == -1) 
    perror("readlink"); 
    else { 
    printf("%s\n", dest); 
    } 
    return 0; 
} 

Si quieres probar, a continuación, puede compilar este, hacer un enlace simbólico desde el ejecutable a otro camino, y llamar al enlace:

$ gcc -o mybin source.c 
$ ln -s ./mybin /tmp/otherplace 
$ /tmp/otherplace 
/home/fser/mybin 
+3

Como se señala en la respuesta de @ Cercerilla, '/ proc/self/exe' funciona igual que'/proc//exe', y no tiene que preocuparse por encontrar su propio pid. –

+2

¡correcto, he estado usando 'self' recientemente! – Aif

1

Obtenga su nombre de argv[0] luego llame al comando which. Esto solo funcionará si tu ejecutable está en $PATH.

Cuestiones relacionadas