gpt4 book ai didi

c++ - 使用 Boost.Asio 执行干净关机的标准方法

转载 作者:IT老高 更新时间:2023-10-28 22:35:50 26 4
gpt4 key购买 nike

我正在使用 Boost.Asio 用 C++ 编写一个跨平台的服务器程序。遵循 this page, 上的 HTTP 服务器示例我想在不使用特定于实现的 API 的情况下处理用户终止请求。我最初尝试使用标准 C 信号库,但一直无法找到适合 Asio 的设计模式。 Windows example's设计似乎与最接近的信号库相似,但存在一种竞争条件,即在服务器对象被销毁后可以调用控制台 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 (old_sigterm == SIG_IGN)
// race condition? raise SIGTERM before I can set ignore back
signal(SIGTERM, SIG_IGN);
s.run();
// reset signals so I can clear reference to io_service
if (old_sigterm != SIG_IGN)
signal(SIGTERM, SIG_DFL);
if (old_sigint != SIG_IGN)
signal(SIGINT, SIG_DFL);
// clear reference to io_service, but can I be sure that handle_signal
// isn't being executed?
sighandler = nullptr;
// io_service is destroyed
}

最佳答案

Boost.Asio 1.5.3 版(要集成到即将发布的 boost 1.47 版本中?)具有 signal_set 类:

#include <boost/asio/signal_set.hpp>

// Register signal handlers so that the daemon may be shut down. You may
// also want to register for other signals, such as SIGHUP to trigger a
// re-read of a configuration file.
boost::asio::signal_set signals(io_service, SIGINT, SIGTERM);
signals.async_wait(
boost::bind(&boost::asio::io_service::stop, &io_service));

编辑

现在 included在 Boost 版本 1.47 中

关于c++ - 使用 Boost.Asio 执行干净关机的标准方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4639909/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com