내 프로그램 (while(1)...select()
)의 메인 루프를 boost::asio::io_service.run()
으로 바꾸려고합니다. 프로그램에는 select()에 의해 모니터 된 몇 개의 소켓이 열려 있습니다.select()를 boost :: 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);
그러나 작동하지 않습니다.
io_service::run()
당신이 사용을 고려 했 호출 방법주 [여론 조사 (2)] (http://man7.org/linux/man-pages/man2/poll.2.html) 대신'select'의 ? –
async_read가 실제로 (io_service가 실행될 때) 작업을 수행하기 전에 'btn'이 범위를 벗어날 수 있으며 따라서 파괴되고 콜백이 호출되지 않습니다. 우리는 추측 할 수 있습니다. 표시된 코드는 괜찮아 보이고 오류는 다른 곳에서 발생할 가능성이 큽니다. – Matthias247