[英]Async wait on file descriptor using Boost Asio
我正在尝试将D-Bus与我的boost::asio
应用程序集成。
D-Bus有一个API,可以枚举一组要监视的Unix文件描述符(主要是套接字,但也可以是FIFO)。 当那些描述符有东西需要阅读时,我应该通知D-Bus API,这样它就可以读取它们并做到这一点。
目前我这样做:
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));
}
但是立即调用处理程序,说它有0个字节需要读取。 我想,只有当有东西要读它被调用,但的boost :: ASIO 无法读取它。 它应该作为一个美化的select()
。 有一个简单的方法吗?
PS:我在我的软件中广泛使用boost::asio
,这只是它的一小部分,所以我不想依赖于glib
或其他主循环。
这正是null_buffers的 设计目标 。
有时,程序必须与希望自行执行I / O操作的第三方库集成。 为此,Boost.Asio包含一个null_buffers类型,可以与读取和写入操作一起使用。 在I / O对象“准备好”执行操作之前,null_buffers操作不会返回。
例如,要执行非阻塞读取,可以使用以下内容:
ip::tcp::socket socket(my_io_service);
...
ip::tcp::socket::non_blocking nb(true);
socket.io_control(nb);
...
socket.async_read_some(null_buffers(), read_handler);
...
void read_handler(boost::system::error_code ec)
{
if (!ec)
{
std::vector<char> buf(socket.available());
socket.read_some(buffer(buf));
}
}
文档中还包含一个很好的示例 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.