2017-09-05 286 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()