Señales de captura: use una función miembro como manejador de señales
Tengo un objeto que hace algo de trabajo en un bucle sin fin. losmain()
crea una instancia del objeto y llama alrun()
método. Como no quiero usar hilos, necesito una solución para que mi objeto deje de ejecutarse. Abajo ves lo que he encontrado.
struct Foo
{
void run()
{
running = 1;
while (running)
do_something_useful();
std::cout << "Execution stopped." << std::endl;
}
bool running;
void catch_signal(int signal)
{
std::cout << "Caught signal " << signal << std::endl;
if( signal == SIGTERM )
running = false;
}
};
Como ves, necesito enviar una señal asincrónicamente. Por lo tanto, yo uso un controlador de señal ysigaction
. Bajo lamain
Me puedo imaginar usar.
int main(int argc, char** argv)
{
Foo foo;
struct sigaction sigIntHandler;
boost::function< void (int) > f;
f = std::bind1st(
std::mem_fun(&Foo::catch_signal), &foo);
f(5); // this call works
sigIntHandler.sa_handler = f; // compiler complains, "cannot assign ..."
sigemptyset(&sigIntHandler.sa_mask);
sigIntHandler.sa_flags = 0;
sigaction(SIGTERM, &sigIntHandler, NULL);
s.run();
}
Lo que esperaría ahora: el programa se ejecuta hasta que lo envíeSIGTERM
que se captura y hará que mi objeto detenga la iteración y vuelva a main.
Tengo dos preguntas ahora:
(a) En el código que ve una línea marcada con "Recopilaciones de compilador", el mensaje es como
boost::function<void(int)> cannot be converted to __sighandler_t {aka void (*)(int)}
¿Qué necesito cambiar para que esto funcione? Yo creo quef
es comovoid f(int)
, como las funciones que obtiene el manejador de señales en algunos ejemplos.
(b) Para aquellos de ustedes que se preguntan "¿qué está haciendo ese tipo?": ¿Tiene algún consejo sobre cómo resolver mejor este tipo de cosas?