2012-04-28 21 views

Respuesta

12

En C y glibc estándar, has argv [0]:

int main (int argc, char *argv[]) 

el primer elemento de la argv array es el nombre del programa.

Sin embargo, no es necesariamente suficiente por sí solo para determinar dónde está exactamente el ejecutable. El argumento realmente lo establece el programa que ejecutó su programa, ya sea un shell o un administrador de ventanas, y no es de mucha ayuda. Si el programa se encuentra en el camino y se ejecuta el programa simplemente con

your_program

en una cáscara del golpe, a continuación, "your_program" es todo lo que se pondrá en argv [0].

Para la ruta completa del ejecutable, linux tiene el /proc filesystem. Debajo de /proc cada proceso en ejecución obtiene su propio "directorio", nombrado por su id de proceso. El proceso en ejecución también puede ver su propio subárbol bajo /proc/self. Uno de los archivos que obtiene cada proceso es /proc/[pid]/exe, que es un enlace simbólico al ejecutable real que está ejecutando el proceso.

Así se puede obtener la trayectoria real completa ejecutable como esto:

#include <stdio.h> 
#include <stdlib.h> 
#include <sys/types.h> 
#include <unistd.h> 

int main(void) { 
    char exe[1024]; 
    int ret; 

    ret = readlink("/proc/self/exe",exe,sizeof(exe)-1); 
    if(ret ==-1) { 
     fprintf(stderr,"ERRORRRRR\n"); 
     exit(1); 
    } 
    exe[ret] = 0; 
    printf("I am %s\n",exe); 
} 

También puede ser capaz de pasar directamente a /proc/[pid]/exeaddr2line().

+1

¡Fantástico! esto funciona perfecto – lurscher

+0

En este caso es más fácil usar '/ proc/self/exe' para que la llamada' getpid() 'no sea necesaria. – Diego

5

Puede acceder argv [0] sin una referencia a la variable real, mediante el uso de un puntero guardado en glibc: https://github.com/rbdixon/glibc/blob/master/misc/init-misc.c

Ejemplo de uso:

extern const char *__progname; 

int print_progname() 
{ 
    return puts(__progname); 
} 

argv [0] no refleja necesariamente el nombre que se utilizó para invocar el programa sin embargo. Ver man 2 execve y man 7 environ para obtener más información.

Cuestiones relacionadas