2017-09-05 284 views
3

我试图用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); 

但是,这是行不通的。

+0

你有没有考虑使用[轮询(2)](http://man7.org/linux/man-pages/man2/poll.2.html),而不是'select' ? –

+0

在执行async_read之前,'btn'可能会超出范围吗(当io_service运行时),因此它被破坏并且回调从未被调用过?我们只能猜测,所显示的代码看起来不错,错误可能在其他地方。 – Matthias247

回答

1

您没有显示任何运行io_servicerun(),poll(),run_one()poll_one())的代码。所以没有事情做完。

使用流的描述从/dev/inputN看一个具体的例子是在这里:

boost::asio read from /dev/input/event0

它只是使用::open打开设备(在这种情况下,/dev/input/event2但它只是一个文件名可以更改)。

注意它是如何调用io_service::run()