Boost logo

Boost Users :

Subject: [Boost-users] [Asio] run_one does not seem to run signal handler but run does
From: Robert Valkenburg (rj.valkenburg_at_[hidden])
Date: 2015-02-28 21:39:09


Hi,

I am reasonably new to Boost.Asio. Below is a short test program to
catch CNTR C. It nearly works as i would have expected.

#include <iostream>

#include <boost/version.hpp>
#define BOOST_ASIO_ENABLE_HANDLER_TRACKING
#include <boost/asio.hpp>

namespace asio = boost::asio;

#define GCC_VERSION (__GNUC__*10000 + __GNUC_MINOR__*100 +
__GNUC_PATCHLEVEL__ )

struct Sig_handler {

  Sig_handler(int& count, asio::signal_set& signals) : count_(count),
signals_(signals) {}

  void operator()(const boost::system::error_code& ec, int signal_number) {
    if (!ec) {
      count_++;
      std::cout << "signal: " << signal_number << std::endl;
      if (count_ < 3)
    signals_.async_wait( Sig_handler(count_, signals_));
    }
    else {
       std::cout << "Sig_handler error" << std::endl;
    }
  }

  int& count_;
  asio::signal_set& signals_;
};

int main()
{
    std::cout << "test_asio_sig starting " << std::endl;
    std::cout << "GCC VERSION " << GCC_VERSION << std::endl;
    std::cout << "BOOST VERSION " << BOOST_VERSION << std::endl;

    asio::io_service io_service;
    asio::signal_set signals(io_service, SIGINT);

    int count = 0;
    std::cout << "count " << count << std::endl;

    signals.async_wait( Sig_handler(count, signals) );

    size_t num_handlers = io_service.run();
    // size_t num_handlers = io_service.run_one(); // <<== NOTE

    std::cout << "num handlers " << num_handlers << std::endl;
    std::cout << "count " << count << std::endl;
    std::cout << "test_asio_sig finishing " << std::endl;
}

Here is the output after pressing CNTR C 3 times

[robert_at_localhost misc]$ ./test_asio_sig
test_asio_sig starting
GCC VERSION 40902
BOOST VERSION 105700
count 0
@asio|1425176527.462503|0*1|signal_set_at_0x7fffcd9139b8.async_wait
^C_at_asio|1425176530.453067|>1|ec=system:0,signal_number=2
signal: 2
@asio|1425176530.453092|1*2|signal_set_at_0x7fffcd9139b8.async_wait
@asio|1425176530.453102|<1|
^C_at_asio|1425176533.749159|>2|ec=system:0,signal_number=2
signal: 2
@asio|1425176533.749187|2*3|signal_set_at_0x7fffcd9139b8.async_wait
@asio|1425176533.749191|<2|
^C_at_asio|1425176548.261061|>3|ec=system:0,signal_number=2
signal: 2
@asio|1425176548.261092|<3|
num handlers 6
count 3
test_asio_sig finishing
@asio|1425176548.261116|0|signal_set_at_0x7fffcd9139b8.cancel
[robert_at_localhost misc]$

I don't understand why io_service.run() says 6 handlers where invoked
but otherwise it seems OK.

Now if i replace io_service.run() with io_service.run_one() i
expected the handler to be invoked once when CNTR C is pressed. Here
is the output

[robert_at_localhost misc]$ ./test_asio_sig
test_asio_sig starting
GCC VERSION 40902
BOOST VERSION 105700
count 0
@asio|1425176928.548934|0*1|signal_set_at_0x7fffe64b8398.async_wait
^Cnum handlers 1
count 0
test_asio_sig finishing
@asio|1425176930.187377|0|signal_set_at_0x7fffe64b8398.cancel
@asio|1425176930.187411|~1|
[robert_at_localhost misc]$

This suggests one handler was invoked which is what i might have expected.
This does not have a line with >1 indicating entering the handler and
there is no output from the handler and count remains at 0.

Could someone help me to understand this.

[ I am using Fedora 21, gcc 4.9.2, x86_64, boost 1.57 ]

kind regards


Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net