Async wartet auf den Dateideskriptor mit Boost Asio
Ich versuche zu integrieren D-Bus mit meinem boost::asio
Anwendung.
D-Bus hat eine API, listet eine Reihe von Unix-Datei-Deskriptoren (vor allem sockel, könnte aber auch sein, FIFOs) beobachtet werden.
Wenn diese Deskriptoren haben etwas zu Lesen, ich sollte informieren, die D-Bus-API, so kann es zu Lesen und Sie tun es ist Sache.
Zurzeit mache ich:
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));
}
Aber der handler wird aufgerufen, sofort zu sagen, dass es 0 bytes gelesen werden. Ich möchte, dass es nur aufgerufen werden, wenn es etwas zu Lesen, aber boost::asio KANN NICHT Lesen. Es handeln sollte, genauso wie ein verherrlicht select()
. Gibt es eine einfache Möglichkeit das zu tun?
PS: ich bin Häufig mit boost::asio
in meiner software, das ist nur ein kleiner Teil davon, also ich möchte nicht abhängig glib
oder andere mainloops.
InformationsquelleAutor der Frage Edu Felipe | 2011-01-13
Du musst angemeldet sein, um einen Kommentar abzugeben.
Genau das ist das problem null_buffers war entworfen.
Gibt es auch eine hervorragendes Beispiel in den Unterlagen enthalten.
InformationsquelleAutor der Antwort Sam Miller