Cómo usarlo en Linux para abrir archivos en rutas relativas
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 p>
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/
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 #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; }