2017-09-05 20 views
3

私のプログラム(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); 

ただし、これは機能しません。

+0

があなたの代わりにSELECT' 'の[世論調査(2)](http://man7.org/linux/man-pages/man2/poll.2.html)を使用することを検討していました呼び出す方法

注意? –

+0

async_readが実際に(io_serviceが実行されているとき)ジョブを実行する前に 'btn'が直接スコープから外れてしまい、それが破壊され、コールバックが呼び出されませんでしたか?私たちは推測することができます、表示されたコードは大丈夫です、エラーは他のどこかにありそうです。 – Matthias247

答えて

1

io_servicerun(),poll(),run_one()またはpoll_one())を実行するコードは表示されません。だから何もできません。

/dev/inputNから読み取るためのストリーム記述子を使用して具体的な例はここにある:

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

それはちょうど、この場合には(/dev/input/event2をデバイスを開くために::openを使用しますが、それはあなたが変更することができますファイル名だけです)。それはio_service::run()

関連する問題