web-dev-qa-db-ja.com

クラッシュしてリセットされた後でも、USBデバイスに同じデバイスファイルを保持させるにはどうすればよいですか?

同じコンピューターに3つのUSB Webカメラと3つのArduinoを接続しています。起動時には、/dev/videoN(Nは0から2になります)および/dev/ttyACMN(Nは0から2になります)。ここまでは順調ですね。

問題は、デバイスの1つで問題が発生したときです(つまり、Arduino、そのIDE、またはビデオキャプチャプログラムがクラッシュする)。次に、デバイスに新しいデバイスファイルが割り当てられます(/dev/video3または/dev/ttyACM3)。代わりに同じデバイスファイルを保持したいと思います。

デバイスの接続と取り外しは役に立ちません。また、相互作用するすべてのプログラムを閉じません。問題が2回発生した場合、さらに別のデバイスファイルが作成され、さらに大きな番号が付けられます。

古いデバイスファイルへのハンドルがどこかに浮かんでおり、同じデバイスファイルが再利用されないようにしています。ただし、元のデバイスファイル自体(たとえば、/dev/ttyACM0)はもう存在しないか、少なくともディレクトリリストに表示されません。

この問題を解決する唯一の方法は、再起動することです。再起動する代わりに、元のデバイスファイルへの残留参照を削除して再利用できるようにする方法はありますか?または、すべてのUSBデバイスの完全なパージを強制し、最初から番号を付け直しますか?

2
cxrodgers

私はこれを理解しました。基本的に、デバイス名が再利用されない場合、それはいくつかのプロセスがまだ古いデバイス名を使用していることを意味します。私はすべてを閉じていると思っていましたが、表示されているすべてのウィンドウを閉じた後でもいくつかのプロセスがまだ実行されていました。

デバイス名を使用しているプロセスを見つける方法は次のとおりです。

lsof | grep /dev/ttyACM0

その後、そのプロセスを強制終了してデバイスの電源を入れ直すと、デバイス名が必要に応じて再利用されます。

1
cxrodgers

udevルールを記述してそれらのデバイスにシンボリックリンクを追加することにより、プロセスを毎回強制終了しなければならないときに頭痛の種を回避できます。

そのため、デバイスが消えるたびに、シンボリックリンクはそれとともに消滅します。その後、デバイスを再接続すると、インクリメントされた番号ex:/dev/ttyACM1で新しいノードが作成されます。ただし、リンクは同じパスに作成されます。

同一のUSB-シリアルアダプタを区別する方法? を参照してください

0
user.dz