Поймать сигналы: использовать функцию-член в качестве обработчика сигнала

У меня есть объект, который выполняет некоторую работу в бесконечном цикле.main() создает объект и вызываетrun() метод. Поскольку я не хочу использовать потоки, мне нужно решение, чтобы мой объект перестал работать. Ниже вы видите, что я придумал.

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;
    }

};

Как видите, мне нужно отправить сигнал асинхронно. Поэтому я использую обработчик сигнала иsigaction, Нижеmain Я могу представить, чтобы использовать.

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();

}

Что бы я ожидал сейчас: программа работает, пока я не отправлюSIGTERM который пойман и заставит мой объект остановить итерацию и вернуться к основному.

У меня сейчас два вопроса:

(а) В коде вы видите строку, помеченную «Жалобы компилятора», сообщение выглядит так:

boost::function<void(int)> cannot be converted to __sighandler_t {aka void (*)(int)}

Что мне нужно изменить, чтобы сделать эту работу? думаюf какvoid f(int)Как и функции, получаемые обработчиком сигнала в некоторых примерах.

(б) Для тех из вас, кто задается вопросом «что делает этот парень?»: есть ли у вас какие-либо советы, как лучше решить эту проблему?

Ответы на вопрос(2)

Ваш ответ на вопрос