相关疑难解决方法(0)

使用Boost.Asio执行干净关闭的标准方法

我正在使用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)

c++ signals console-application boost-asio

14
推荐指数
2
解决办法
1万
查看次数

标签 统计

boost-asio ×1

c++ ×1

console-application ×1

signals ×1