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.

Accediendo a las variables de la función main() dentro del manejador de señales en C++

Quiero cambiar las variables declaradas en la función principal usando un gestor de señales cuando se envía una señal definida por el usuario al proceso. No quiero usar variables globales.

A continuación se muestra un código de ejemplo.

#include <iostream>
#include <csignal>

void signal_handler(int sig) {
    // Quiero cambiar el valor de 'b' aquí
}

int main() {
    signal(SIGUSR1, signal_handler);
    int a, b = 10;
    while(1) {
        std::cin >> a;
        std::cout << a * b << std::endl;
    }
}

En lugar de ‘b’, podría ser cualquier otro tipo de variable (un descriptor de archivo de socket, una conexión de MySQL, etc.) que el programa deba actualizar una vez que se envía una señal. Usar variables globales para todas estas tareas no es bueno.

Entonces, por favor sugiera los diferentes métodos para lograrlo.
Gracias.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Una forma de lograr esto es utilizando una estructura para almacenar las variables que quieres cambiar y pasando un puntero a ella a la función del manejador de señal. Aquí tienes un ejemplo de código:

    #include <iostream>
    #include <csignal>
    
    struct Data {
        int a, b;
    };
    
    void signal_handler(int sig, siginfo_t* siginfo, void* context) {
        // Obtener el puntero a la estructura de datos desde la información de la señal
        Data* data = static_cast<data*>(siginfo->si_value.sival_ptr);
        // Cambiar el valor de b
        data->b = 20;
    }
    
    int main() {
        struct sigaction sa;
        sa.sa_flags = SA_SIGINFO;
        sa.sa_sigaction = signal_handler;
        sigaction(SIGUSR1, &sa, NULL);
    
        Data data = {10, 30};
        while(1) {
            std::cin >> data.a;
            std::cout << data.a * data.b << std::endl;
        }
        return 0;
    }
    

    En este código, definimos una estructura Data que almacena las variables que queremos cambiar. Dentro de la función del manejador de señal, obtenemos un puntero a esta estructura a través del parámetro siginfo_t y cambiamos el valor de b.

    Para pasar el puntero a la estructura al manejador de señal, utilizamos la función sigaction con la bandera SA_SIGINFO y establecemos la función del manejador de señal como sa_sigaction. Dentro de la función main, creamos una instancia de la estructura Data y la utilizamos para almacenar las variables que queremos cambiar.</data*>

Comments are closed.