Qt no integra ninguna solución que encapsule y simplifique la gestión de señales POSIX, puesto que éstas no están disponibles en sistemas operativos que no soporten dicha especificación. Aun así en la documentación de Qt se describe una forma de usar manejadores de señales POSIX. Realmente basta con que el manejador de señal haga algo que provoque que Qt emita una señal y después retorne. Al volver a la secuencia normal de ejecución del programa, se emitiría la señal de Qt invocando el slot al que está conectada, desde donde se ejecutarían de forma segura las operaciones que fueran necesarias. Para esta entrada he creado una clase en C++ llamada QPosixSignalListener que permite abstraer todo el proceso de gestión de señales. Me basé en el artículo de la documentación oficial que trata sobre manejo de señales. Diagrama de uso de la clase:
Interfaz de la clase:
classQPosixSignalListener:publicQObject
{
Q_OBJECT
public:
/**Constructor.Setealasseñalesycrea
*lossocketscorrespondientes
*
*@paramparentPadredelobjeto
***/
QPosixSignalListener(QObject*parent=0);
~QPosixSignalListener(){}
//Unixsignalhandlers.
staticvoidhupSignalHandler(int);
staticvoidtermSignalHandler(int);
staticvoidusr1SignalHandler(int);
staticvoidusr2SignalHandler(int);
//SettheUnixsignalhandlers
staticintsetup_unix_signal_handlers();
privateslots:
//Qtsignalhandlers.
voidhandlerQt_SIGHUP();
voidhandlerQt_SIGTERM();
voidhandlerQt_SIGUSR1();
voidhandlerQt_SIGUSR2();
signals:
//Signals
voidsigHUP();
voidsigTERM();
voidsigUSR1();
voidsigUSR2();
private:
//sockets
staticintsocketSIGHUP[2];
staticintsocketSIGTERM[2];
staticintsocketSIGUSR1[2];
staticintsocketSIGUSR2[2];
//SocketNotifiers
QSocketNotifier*skNotifierHUP;
QSocketNotifier*skNotifierTERM;
QSocketNotifier*skNotifierUSR1;
QSocketNotifier*skNotifierUSR2;
};
La clase puede manejar las señales SIGHUP, SIGTERM, SIGUSR1 y SIGUSR2. Puedes modificarla para que soporte otras. USO:
Cuando el proceso recibe una señal (soportada) el objeto emite una señal de Qt. Para usar la clase solo basta con instanciar un objeto y conectar una de sus señales a un slot cualquiera. Ejemplo: