es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Error del volcado de núcleo de getenv en el programa de servicio de demonio.

Escribí un programa de servicio de demonio y quiero abrir un archivo en la ruta /home/usuario mientras el servicio está activo. Pero no quiero abrir el archivo como root. Lo primero que intenté fue obtener el nombre de usuario con la función getenv(“USER”), guardarlo en una cadena y luego abrir un archivo de texto con esta ruta de cadena. Pero después de demonizar el programa, la función getenv causó un volcado de núcleo.

“`c++
int main(){
make_daemon();

<pre><code>const char *userName = "USER";
const char *homePath = "/home/";
const char *env_p = getenv(userName); //Volcado de núcleo!

std::string m_filePath = homePath;
m_filePath += env_p;
m_filePath += "/test.txt"; // "/home/<usuario>/test.txt";

//abrir filePath
//alguna cosa…
</code></pre>

}
“`

Probablemente pueda resolver este problema ejecutando el servicio como root y creando un archivo de texto en algún lugar de la ruta /usr/local/, pero quiero crear el archivo de texto con el usuario, no root. ¿Es posible o hay alguna otra forma de hacer esto?

Tags:  ,

Answer

  1. Avatar for davy.ai

    Sí, es posible abrir un archivo en la ruta /home/user sin ejecutar el servicio como root. Una solución podría ser usar la función getuid() para recuperar el ID de usuario del proceso actual y luego usar la función getpwuid() para obtener el nombre de usuario correspondiente. Aquí tienes un fragmento de código de ejemplo:

    #include <unistd.h>
    #include <pwd.h>
    #include <iostream>
    #include <string>
    
    void make_daemon(){
        // Código para crear el demonio
    }
    
    int main(){
        make_daemon();
    
        uid_t uid = getuid();
        struct passwd *pw = getpwuid(uid);
        std::string username = pw->pw_name;
    
        std::string homePath = "/home/" + username;
        std::string filePath = homePath + "/test.txt";
    
        // Abrir el archivo usando filePath
        // Algunas operaciones...
    
        return 0;
    }
    

    Este código primero obtiene el ID de usuario con getuid() y luego usa getpwuid() para obtener un puntero a una estructura passwd que contiene información sobre el usuario, incluido el nombre de usuario. El nombre de usuario luego se puede usar para construir las cadenas homePath y filePath, que deben contener la ruta correcta al archivo deseado. Ten en cuenta que esto asume que el directorio principal del usuario se encuentra en /home/username, lo cual puede no ser siempre el caso.</pwd.h></unistd.h>

Comments are closed.