Próbuję zintegrować D-Bus z moją aplikacją boost::asio
.Asynch czekać na deskryptor pliku za pomocą Boost Asio
D-Bus ma interfejs API, który wylicza zestaw deskryptorów plików Unix (głównie gniazda, ale może również być FIFO) do obejrzenia. Gdy te deskryptory mają coś do przeczytania, powinienem poinformować D-Bus API, aby mógł je przeczytać i zrobić to.
Obecnie robię tak:
using boost::asio::posix::stream_descriptor;
void read_handle(stream_descriptor* desc, const boost::system::error_code& ec,
std::size_t bytes_read)
{
if (!ec) {
stream_descriptor::bytes_readable command(true);
descriptor->io_control(command);
std::size_t bytes_readable = command.get();
std::cout << "It thinks I should read" << bytes_readable
<< " bytes" << std::endl;
} else {
std::cout << "There was an error" << std::endl;
}
}
void watch_descriptor(boost::asio::io_service& ios, int file_descriptor)
{
// Create the asio representation of the descriptor
stream_descriptor* desc = new stream_descriptor(ios);
desc->assign(file_descriptor);
// Try to read 0 bytes just to be informed that there is something to be read
std::vector<char> buffer(0);
desc->async_read_some(boost::asio::buffer(buffer, 0),
boost::bind(read_handle, desc, _1, _2));
}
Ale obsługi nazywany jest od razu powiedzieć, że ma 0 bajtów do odczytu. Chciałbym, żeby to było wywoływane tylko wtedy, gdy jest coś do odczytania, ale boost :: asio CAN NOT przeczytać. Powinien działać tak, jak uwielbiony select()
. Czy istnieje prosty sposób na zrobienie tego?
PS: W moim oprogramowaniu intensywnie używam boost::asio
, jest to tylko niewielka jego część, więc nie chciałbym polegać na glib
lub innych urządzeniach głównych.
Co to jest interfejs D-Bus API, którego używasz? Czy jest to C API niskiego poziomu? –