我试图用boost::asio::io_service.run()
替换程序中的主循环(while(1)...select()
)。 该程序有一个打开的套接字,由select()进行监视。用boost替换select():: asio :: io_service
棘手的部分是,select语句中的FD_SET具有套接字文件描述符以及char设备描述符(用于硬件输入)。在前面的代码中,调用int fd = open("/dev/button1", O_RDONLY);
就足够了,并且将该fd添加到FD_SET。 select()
声明能够监控所有这些声明。
因此,为了能够从boost::asio::io_service
监控字符设备,我一直在阅读很多关于boost::asio::stream_descriptor
。但是我一直无法让它工作。
我试过正常打开设备,然后创建一个stream_descriptor,并将其添加到ioservice。
int fd = open("/dev/button1", O_RDONLY);
boost::asio::posix::stream_descriptor btn(io_service, fd);
boost::asio::async_read(btn, buffer, &button_callback);
但是,这是行不通的。
你有没有考虑使用[轮询(2)](http://man7.org/linux/man-pages/man2/poll.2.html),而不是'select' ? –
在执行async_read之前,'btn'可能会超出范围吗(当io_service运行时),因此它被破坏并且回调从未被调用过?我们只能猜测,所显示的代码看起来不错,错误可能在其他地方。 – Matthias247