我正在使用Boost.Asio在C++中编写跨平台服务器程序.遵循此页面上的HTTP Server示例,我想在不使用特定于实现的API的情况下处理用户终止请求.我最初尝试使用标准C信号库,但一直无法找到适合Asio的设计模式.在Windows示例的设计似乎像最近的信号库,但有一个竞争条件,其中服务器对象已被破坏后控制台CTRL处理程序可以调用.我试图避免C++标准规定的未定义行为.
是否有标准(和正确)方法来停止服务器?
为了说明使用C信号库的问题:
#include <csignal>
#include <functional>
#include <boost/asio.hpp>
using std::signal;
using boost::asio::io_service;
namespace
{
std::function<void ()> sighandler;
}
extern "C"
{
static void handle_signal(int);
}
void handle_signal(int)
{
// error - undefined behavior
sighandler();
}
int main()
{
io_service s;
sighandler = std::bind(&io_service::stop, &s);
auto old_sigint = signal(SIGINT, &handle_signal);
if (old_sigint == SIG_IGN)
// race condition? raise SIGINT before I can set ignore back
signal(SIGINT, SIG_IGN);
auto old_sigterm = signal(SIGTERM, &handle_signal);
if …Run Code Online (Sandbox Code Playgroud)