Bueno, tienes que usar getcwd()
en conjunción con argv[0]
. El primero le brinda el directorio de trabajo, el segundo le brinda la ubicación relativa del binario desde el directorio de trabajo (o una ruta absoluta).
Editar: Se señaló que usar /proc/self/exe
es más sencillo. Eso es completamente cierto, pero no vi ningún beneficio en editar el código. Como todavía recibo comentarios al respecto, lo he editado.
#include <unistd.h>
#include <limits.h>
#include <stdio.h>
#include <string.h>
int main()
{
char dest[PATH_MAX];
memset(dest,0,sizeof(dest)); // readlink does not null terminate!
if (readlink("/proc/self/exe", dest, PATH_MAX) == -1) {
perror("readlink");
} else {
printf("%s\n", dest);
}
return 0;
}
Respuesta inicial: Puede usar 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 programa real. Luego, usando readlink(), puede encontrar la ruta completa del programa.
Aquí hay una implementación en C:
#include <sys/types.h>
#include <unistd.h>
#include <limits.h>
#include <stdio.h>
#include <string.h>
int main()
{
char path[PATH_MAX];
char dest[PATH_MAX];
memset(dest,0,sizeof(dest)); // readlink does not null terminate!
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 desea intentarlo, puede compilar esto, hacer un enlace simbólico desde el ejecutable a otra ruta y llamar al enlace:
$ gcc -o mybin source.c
$ ln -s ./mybin /tmp/otherplace
$ /tmp/otherplace
/home/fser/mybin
Usa el sistema de archivos proc
Su flujo sería:
- Obtener pid del ejecutable
- mira
/proc/PID/exe
para un enlace simbólico
El archivo /proc/self/exe es un enlace simulado al ejecutable que se está ejecutando actualmente.