@ Тимоти, это правильная ссылка, я отредактировал свой ответ. Я не слишком знаком со стандартом C, хотя у меня никогда не было проблем с использованием только функций, перечисленных в справочной странице по сигналам из обработчика сигналов.

у кроссплатформенную серверную программу на C ++, используя Boost.Asio. Следуя примеру HTTP-сервера наэта страница, Я хотел бы обработать запрос на завершение работы пользователя без использования API, специфичных для реализации. Первоначально я пытался использовать стандартную библиотеку сигналов С, но не смог найти шаблон проектирования, подходящий для 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 (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
}

Ответы на вопрос(2)

Ваш ответ на вопрос