2012-04-28 10 views

Odpowiedz

12

w standardowych C glibc zostały argv [0]

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

pierwszy element z argv array to nazwa programu.

Jednak nie wystarczy samodzielnie określić, gdzie dokładnie znajduje się plik wykonywalny. Argument jest faktycznie ustawiony przez program, który uruchomił twój program - czy to skorupa, czy menedżer okien - i nie są one strasznie pomocne. Jeśli program znajduje się na ścieżce i uruchomieniu programu po prostu z

your_program

w powłoce bash, a następnie „your_program” to wszystko otrzymasz w argv [0].

Dla pełnej ścieżki wykonywalnej, linux ma /proc filesystem. Zgodnie z /proc każdy uruchomiony proces otrzymuje własny "katalog", nazwany jego identyfikatorem procesu. Działający proces może również zobaczyć własne poddrzewo pod numerem /proc/self. Jeden z plików otrzymywanych przez każdy proces to /proc/[pid]/exe, który jest dowiązaniem symbolicznym do faktycznego pliku wykonywalnego, w którym proces jest uruchomiony.

Więc można uzyskać rzeczywiste pełną ścieżkę pliku wykonywalnego tak:

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

może także być w stanie przekazać /proc/[pid]/exe bezpośrednio do addr2line().

+1

Fantastyczne! to działa idealnie – lurscher

+0

W tym przypadku łatwiej jest użyć '/ proc/self/exe', aby wywołanie' getpid() 'nie było potrzebne. – Diego

5

można uzyskać dostęp argv [0] bez odniesienia do zmiennej rzeczywistej, za pomocą zapisanego wskaźnik w glibc: https://github.com/rbdixon/glibc/blob/master/misc/init-misc.c

Przykład użycia:

extern const char *__progname; 

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

argv [0] nie muszą odzwierciedlać nazwa, która została użyta do wywołania programu. Zobacz man 2 execve i man 7 environ, aby uzyskać więcej informacji.

Powiązane problemy