GNU/Linux >> Tutoriales Linux >  >> Linux

¿Puede un ejecutable descubrir su propio camino? (linux)

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.


Linux
  1. Obtener la dirección IP de una interfaz en Linux

  2. ¿Qué es un inodo anónimo en Linux?

  3. ¿Puedo jugar Dota 2 en Linux?

  4. ¿Puedo agregar un acceso directo para reemplazar una ruta en Linux?

  5. ¿Cómo puedo editar $ PATH en Linux?

13 maneras en que puede ayudar a Linux

Cómo hacer un archivo ejecutable en Linux

Kernel de Linux y sus funciones

¿Puede Bash escribir en su propio flujo de entrada?

Linux:agregar un directorio a PATH

¿Cómo puedo buscar un archivo por su nombre y ruta parcial?