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]/exe
addr2line()
.
fonte
2012-04-28 16:15:31
Puoi ottenerlo da argv [0] – BlackBear
Argv [0] non è quello che vuoi, per qualche motivo? – thb