我試圖用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