[/
 / Copyright (c) 2003-2021 Christopher M. Kohlhoff (chris at kohlhoff dot com)
 /
 / Distributed under the Boost Software License, Version 1.0. (See accompanying
 / file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
 /]

[section:SignalHandler Signal handler requirements]

A signal handler must meet the requirements for a [link
asio.reference.Handler handler]. A value `h` of a signal handler class
should work correctly in the expression `h(ec, n)`, where `ec` is an lvalue of
type `const error_code` and `n` is an lvalue of type `const int`.

[heading Examples]

A free function as a signal handler:

  void signal_handler(
      const asio::error_code& ec,
      int signal_number)
  {
    ...
  }

A signal handler function object:

  struct signal_handler
  {
    ...
    void operator()(
        const asio::error_code& ec,
        int signal_number)
    {
      ...
    }
    ...
  };

A lambda as a signal handler:

  my_signal_set.async_wait(
      [](const asio::error_code& ec,
        int signal_number)
      {
        ...
      });

A non-static class member function adapted to a signal handler using
`std::bind()`:

  void my_class::signal_handler(
      const asio::error_code& ec,
      int signal_number)
  {
    ...
  }
  ...
  my_signal_set.async_wait(
      std::bind(&my_class::signal_handler,
        this, std::placeholders::_1,
        std::placeholders::_2));

A non-static class member function adapted to a signal handler using
`boost::bind()`:

  void my_class::signal_handler(
      const asio::error_code& ec,
      int signal_number)
  {
    ...
  }
  ...
  my_signal_set.async_wait(
      boost::bind(&my_class::signal_handler,
        this, asio::placeholders::error,
        asio::placeholders::signal_number));

[endsect]
