0

私はコンピュータが稼働しているときに常に実行されるプログラムを持っています。USBデバイスを介してシリアルとインターフェースします。コンピュータの電源が入っているときに、デバイスが存在しない場合があります。

私の質問は、デバイスファイルが存在するようになったときに確認するための良い方法です。ファイルの名前がわかっていると仮定して、ファイルを継続的にチェックする無限ループを作成し、fdを取得するとファイルが中断する可能性があります。しかし、これよりも良い方法はありますか?

さらに、プログラムの実行中にデバイスのプラグが抜かれると仮定すると、私のfdは無効になります。これが発生したときに何らかのイベントまたはエラーがスローされるので、デバイスファイルが再び存在するまでチェックを再開できますか?

選択ループを使用してfdから読み取りました。

4

2 に答える 2

2

Linux では、 を使用して、デバイスが接続または削除されたときに、アプリケーションに通知できますudev

素晴らしい例として、この通知機能を見てください: udev-notify

libudev APIを使用すると、カーネル イベントをリッスンし、デバイスが使用可能になったとき、またはデバイスが削除されたときに通知を受け取り、そのようなイベントが発生したときに行うことを決定できます。

于 2011-06-23T16:56:37.810 に答える
0

歴史的には、ポーリング (上記の「ファイル」が存在するかどうかを特定の間隔で判断するループ) のソリューションが「最良の」ソリューションでした。最新の Linux (2.6.12 以降を指定していないが、指定しなかった) を使用している場合は、inotifyを使用できます。これは、ファイルの作成 (IN_CREATE) のディレクトリを監視することで、おそらく必要なことを正確に実行します。私がリンクしたウィキペディアの記事には、非常に優れた概要と役立つリンクが記載されています。

抜けてしまう部分がトリッキーです。*nix でファイルが削除された場合 (はるか昔にさかのぼります)、そのファイル記述子は引き続き有効です。したがって、それextern int errno;があなたの解決策かもしれないと思います。あなたの投稿は「C」でタグ付けされていたので、「スロー」するものは何もありませんが、read(または何でも) 呼び出しが失敗したときにこれを確認すると、洞察を得ることができます。

libudev もチェックしてください。これはもちろん、*nix の一般的な「すべてがファイルである」という哲学よりも、デバイスに固有のものです。

于 2011-06-23T16:49:18.243 に答える