我有以下代码段:
#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,但这看起来是一个不同的问题。
答案 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();
}