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?

Respuestas a la pregunta(2)

Su respuesta a la pregunta