Estoy tratando de hacer que un archivo se instale solo en el sistema (linux).
Todos los métodos que uso (renombrar, sistema (mv), execl, etc.) fallan. ¿Hay alguna forma de hacer que un ejecutable en ejecución se mueva mientras se ejecuta? Lo más cerca que he llegado es cambiarle el nombre, pero solo dentro del mismo directorio.
El siguiente código se "copia" a sí mismo en un nuevo destino y se elimina después de la terminación. Básicamente, el código crea una nueva entrada (vínculo fijo) en la ubicación especificada y elimina la actual (del directorio de llamadas). El contenido del archivo se conservará, ya que no hay copia y borrado involucrados.
#include <stdlib.h> #include <stdio.h> #include <string.h> #include <unistd.h> #include <libgen.h> int main(int argc, const char *argv[]) { //current filepath (dir + name) const char* file_path = argv[0]; //extract filename component (needed to append to newdir) char* file_name_ = strdup(file_path); char* file_name = basename(file_name_); //make new path name char* new_dir = "<put your destination here - with no slash ('/') at the end>"; size_t new_path_len = strlen(new_dir) + strlen(file_name) + 2; //two extra bytes: '/' + '\0' char new_path[new_path_len]; snprintf(new_path, new_path_len, "%s/%s", new_dir, file_name); //make a new name for a file (hardlink) link(file_path, new_path); //delete a name and possibly the file it refers to unlink(file_path); //cleanup free(file_name_); return 0; } Sugerencia: se recomienda encarecidamente un estudio cuidadoso de la documentación a link (especialmente la sección de ERRORES ).
Referencias:
basename - analiza los componentes del nombre de la ruta
link - crea un nuevo nombre para un archivo
desvincular : elimina un nombre y posiblemente el archivo al que se refiere