2012-04-28 18 views

risposta

12

In C standard glibc, avete argv [0]:

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

il primo elemento del L'array argv è il nome del programma.

Tuttavia, non è necessariamente sufficiente da solo per determinare dove si trova esattamente l'eseguibile. L'argomento è in realtà impostato dal programma che ha eseguito il programma, che si tratti di una shell o di un gestore di finestre, e non sono di grande aiuto. Se il programma è nel percorso e si esegue il programma semplicemente con

your_program

ad una shell bash, poi "your_program" è tutto ciò che otterrete in argv [0].

Per il percorso completo dell'eseguibile, linux ha lo /proc filesystem. Sotto /proc ogni processo in esecuzione ottiene la sua "directory", nominata dal suo id di processo. Il processo in esecuzione può anche vedere la propria sottostruttura sotto /proc/self. Uno dei file ricevuti da ogni processo è /proc/[pid]/exe, che è un collegamento simbolico all'eseguibile effettivo in cui è in esecuzione il processo.

Così si può ottenere il percorso effettivo completo eseguibile in questo modo:

#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); 
} 

Si può anche essere in grado di passare direttamente a /proc/[pid]/exeaddr2line().

+1

Fantastico! questo funziona perfettamente – lurscher

+0

In questo caso è più facile usare '/ proc/self/exe' in modo che la chiamata' getpid() 'non sia necessaria. – Diego

5

È possibile accedere argv [0] senza riferimento alla variabile reale, utilizzando un puntatore memorizzato in glibc: https://github.com/rbdixon/glibc/blob/master/misc/init-misc.c

Utilizzo Esempio:

extern const char *__progname; 

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

argv [0] non necessariamente riflettono il nome che è stato usato per invocare il programma però. Vedi man 2 execve e man 7 environ per ulteriori informazioni.

Problemi correlati