Использование boost :: asio чтение асинхронного сокета домена unix /run/acpid.socket - PullRequest
0 голосов
/ 05 ноября 2018

Я пытаюсь прочитать события из демона acpi. Я хочу знать, когда кнопка питания нажата и для событий на основе асинхронных вещей.

Знаете ли вы лучший способ сделать это без acpi?

Мой текущий пример кода (кстати, работает способ синхронизации):

#include <cstdlib>
#include <cstring>
#include <iostream>
#include <boost/asio.hpp>
#include <thread>
#include <chrono>

using boost::asio::local::stream_protocol;
using namespace std; // For strlen.

enum { max_length = 1024 };
boost::asio::streambuf response;

void handle_read_content(const boost::system::error_code& err, std::size_t bytes_transferred)
{
  std::cout << "handle_read_content" << std::endl;
  if (!err)
  {
     // Write all of the data that has been read so far.
     std::cout << &response;
   }
   else if (err != boost::asio::error::eof)
   {
     std::cout << "Error: " << err << "\n";
   }
}

int main(int argc, char* argv[])
{
  try
  {

    boost::asio::io_service io_service;
    stream_protocol::socket s(io_service);
    stream_protocol::endpoint ep("/run/acpid.socket");
    s.connect(ep);

    std::cout << "Set the async_read" << std::endl;
    boost::asio::async_read(s, response,
            boost::asio::transfer_all(),
            handle_read_content);

    std::cout << "Sart the io_service" << std::endl;
    io_service.run();

  }
  catch (std::exception& e)
  {
    std::cerr << "Exception: " << e.what() << "\n";
  }

  //do not quit the application
  for(;;) {
    std::this_thread::sleep_for(std::chrono::seconds(1));
  }

  return 0;
}

handle_read_content никогда не вызывается:

   Set the async_read
   Start the io_service

Но acpi_listen показывает правильный вывод:

   acpi_listen
   PNP0C14:01 000000d0 00000000

У вас есть подсказки, идеи или вы можете указать мне правильное решение?

Спасибо, все равно и пока Darian

...