Red de conocimiento informático - Material del sitio web - Cómo usarlo en Linux para abrir archivos en rutas relativas

Cómo usarlo en Linux para abrir archivos en rutas relativas

1. Si el programa no está hecho por sí mismo, entonces es un mal programa. Los programas malos deben incluirse en scripts Bash: #!/bin/bash

set -e

cd $(readlink -f $(dirname $0))

exec ./myprog $*

El script anterior determina el directorio en el que se encuentra, luego cambia el directorio de trabajo actual a ese directorio y ejecuta el programa myprog desde ese directorio a través de todos los medios transparentes. Debe colocar el script en el directorio donde se encuentra su programa y luego ejecutarlo. Suponiendo que tiene acceso al código fuente y repara el programa, puede determinar la ubicación y la ruta absoluta del programa a través del sistema de archivos proc. Por ejemplo, /proc/self/exe siempre será el binario al que apunta el enlace simbólico para el proceso actual. Utilice readlink para leer su valor, luego corte el ejecutable y el directorio resultante.

2. Hace algún tiempo surgió una pregunta, ¿cómo encontrar la ubicación del archivo ejecutable en lenguaje C?

3. Una forma es usar ARGV [0] - para tener una ruta relativa al programa (por ejemplo, /programs/test/a.out). Si corta el programa y agrega una ruta relativa al archivo, obtendrá un monstruo (por ejemplo, /programs/test/... /... /input_data), pero debería funcionar.

4. La forma más sencilla es colocar el programa en un lugar conocido previamente (como /bin, /usr/bin, etc.). De lo contrario, ingrese argv[0], elimine el programa (la última parte) y anteponga todas las rutas relativas al directorio de trabajo (si desea que las rutas relativas sean relativas al directorio donde está el programa). Además, puede decidir en qué directorio se encuentra (usando la ruta argv[0]) y llamar a chdir() con ese directorio. De ahora en adelante, todas las rutas relativas son relativas al programa en el que se encuentran. Sin embargo, cabe señalar que en este caso se debe determinar si argv [0] ocupa una ruta absoluta. De lo contrario, debe obtener el directorio de trabajo actual (getcwd()) y agregar ese directorio a la sección argv[0]. Pero tenga en cuenta que cambiar el directorio de trabajo actual generalmente no es una buena idea. Por lo general, esto no es una buena idea, porque si se le proporciona una ruta de archivo, será relativa al directorio de trabajo actual, no al lugar donde está almacenado el programa. Por ejemplo: imagina que tu programa está almacenado en /usr/bin: /usr/bin/myprog

(Este será argv[0], poda los archivos ejecutables en tu directorio /bin /myprog

Ahora, argv[0] es una ruta relativa. Debe anteponer la ruta en argv[0] con el directorio de trabajo actual (/usr): /usr/. Utilice rutas absolutas. Puede definir una constante en el archivo de encabezado config.h para especificar el archivo ejecutable que se instalará. Luego, anteponga las rutas relativas especificadas en el código.

6.openat abrirá una. archivo de ruta relativa basado en el descriptor de archivo de directorio específico que pasa, pero no creo que eso sea lo que realmente desea (exactamente), necesita encontrar el directorio ejecutable actual del archivo y luego crea una llamada abierta relativa a ese directorio (. use operadores de cadena para construir la ruta, abrir o cambiar el directorio actual a ese directorio) readlink lee un enlace simbólico que apunta a la ruta, donde /proc/self es un símbolo Enlace a /proc/, donde es el ID del proceso actual (la excepción se maneja en el kernel) y exe es un enlace simbólico al ejecutable de ese proceso. Luego, debe generar la ruta al ejecutable. Todo lo dicho, escribiendo programas en. debe evitarse de tal manera que encuentren el equivalente de su ejecutable.

7. Bueno, si tu programa necesita abrir archivos desde una ubicación que depende de dónde esté el instalador, debes hacer esta opción. Su sistema de compilación configura algunas macros CPP que indican un problema con los archivos de datos que se pueden encontrar en ese directorio. Esto es lo que suele hacer la opción -datadir en la configuración estándar incorporada "configurar, crear, realizar instalación". Por supuesto, si realmente lo necesita, también puede cambiar el directorio de trabajo mediante programación utilizando la función chdirPOSIX. Pero como dije, si el programa necesita saber su ubicación, y esto se debe proporcionar, entonces no es necesario anular la selección del directorio de trabajo.

8. Puede determinar la ruta de ejecución de argv[0], pero tenga cuidado al hacerlo. Lo que estás describiendo es una semántica esperada bien conocida. Los usuarios esperan ver este comportamiento.

9. Aquí está su código para encontrar el programa en la ruta de instalación (reemplace "test0002" con su programa): #include

#include

#include

#include

#includes "test0002".p>

#include < string>

#include

#include

///============= ==================== =============================== ===============

std::string FindInstallPath()

{

std::string sret= "";

int pid = (int)getpid();

bool b=false;

std::string sf, s;

std::stringstream ss;

ss << "/proc/" << pid << "/maps";

sf = ss.str();

std::ifstream ifs(sf.c_str());

size_t pos1, pos2;

while (!b && ifs.good())

{

std::getline(ifs, s);

if ((pos1 = s.rfind("test0002")) != std: :string::npos)

{

if ((pos2 = s.find_first_of('/')) != std::string::npos)

sret = s.substr(pos2, pos1 - pos2);

b = true;

}

}

si (!b) sret = "";

ifs.close();

devolver sret;

}