Tôi đang cố gắng tích hợp D-Bus với ứng dụng boost::asio
của tôi.Async chờ trên bộ mô tả tập tin bằng cách sử dụng Boost Asio
D-Bus có API liệt kê một bộ mô tả tệp Unix (chủ yếu là ổ cắm nhưng cũng có thể là FIFO) để được theo dõi. Khi những mô tả đó có nội dung cần đọc, tôi nên thông báo cho API D-Bus để nó có thể đọc và làm điều đó.
Hiện nay tôi đang làm điều này:
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));
}
Nhưng xử lý được gọi ngay lập tức nói rằng nó có 0 byte để được đọc. Tôi muốn nó được gọi chỉ khi có một cái gì đó để được đọc, nhưng tăng :: asio KHÔNG THỂ đọc nó. Nó sẽ hoạt động giống như một số select()
được tôn vinh. Có cách nào đơn giản để làm điều đó không?
PS: Tôi đang sử dụng rộng rãi boost::asio
trong phần mềm của mình, đây chỉ là một phần nhỏ của nó, vì vậy tôi không muốn phụ thuộc vào glib
hoặc các vòng lặp chính khác.
API D-Bus bạn đang sử dụng là gì? Có phải API C cấp thấp không? –