为什么立即取消提升asio信号处理程序?

时间:2014-01-14 14:13:01

标签: c++ boost signals boost-asio

我有以下代码段:

#include <signal.h>
#include <boost/asio.hpp>
#include <iostream>

void startAsyncWaitForSignal(boost::asio::io_service& ioService)
{
    boost::asio::signal_set signals{ioService};
    signals.add(SIGTERM);
    signals.async_wait(
        [&ioService](boost::system::error_code errorCode, int signalNumber)
        {
            std::cerr << errorCode.message() << std::endl;
            if (!errorCode) {
                std::cerr << "received signal " <<  signalNumber << std::endl;
                startAsyncWaitForSignal(ioService);
            }
        }
    );
}

int main() {
    boost::asio::io_service ioService;
    startAsyncWaitForSignal(ioService);
    ioService.run();
}

我希望这个程序等待,直到第一个SIGTERM到达,然后等到下一个,然后再到下一个,...

但是程序会立即终止,输出如下:

Operation canceled

立即取消操作的原因是什么?我试图创建一个io_service :: work对象,但这只是改变了ioService.run()没有完成的事实,但signal_set仍然被立即取消。

我正在使用boost 1.54。有一个bug fix related to asio/signals in 1.55,但这看起来是一个不同的问题。

1 个答案:

答案 0 :(得分:4)

离开startAsyncWaitForSignal()时,本地signal_set变量会被销毁,async_wait()来电被取消。 signal_set需要活得更久一点。将其移出startAsyncWaitForSignal()并将其作为参数传递,例如:

#include <signal.h>
#include <boost/asio.hpp>
#include <iostream>

void startAsyncWaitForSignal(boost::asio::io_service& ioService, boost::asio::signal_set& signals)
{
    signals.async_wait(
        [&ioService, &signals](boost::system::error_code errorCode, int signalNumber)
        {
            std::cerr << errorCode.message() << std::endl;
            if (!errorCode) {
                std::cerr << "received signal " <<  signalNumber << std::endl;
                startAsyncWaitForSignal(ioService, signals);
            }
        }
    );
}

int main() {
    boost::asio::io_service ioService;
    boost::asio::signal_set signals{ioService};
    signals.add(SIGTERM);
    startAsyncWaitForSignal(ioService, signals);
    ioService.run();
}