この質問には USB の知識は必要ありません。例をより具体的にするために説明しただけです。
USB バス上の特定のデバイスに動的スーパーバイザを実装しようとしています。これらのデバイスにはアドレスがあり、システムの存続期間中に現れたり消えたりします。
デバイスごとに、スーパーバイザーの動的な子が必要です。
これらの子は一時的なものであるため、いったんクラッシュまたは終了すると、再起動しません (おそらくその時点でなくなっているため)。
特定の時間に USB ポートをスキャンし、処理したい USB デバイスのすべてのアドレスのリストを生成するプロセスがあります。
supervisor:which_children/1
各スキャンの前に呼び出して、存在するが子プロセスが実行されていないデバイスを見つける予定です。
実行中の子を持つアドレスを見つけるために、アドレスを含む childspec の Id アトムを作成する予定です (可能なアドレスはわずかしかありません)。たとえば adr_12
、子が address を処理する場合12
です。
行方不明の子を開始/再起動しようとすると、一時的な子が終了またはクラッシュしたときに子仕様が自動的に削除されないというやや醜い状況があります (少なくともそうであると思います)。したがって、次のようなコードが必要になります。
case supervisor:start_child(my_sup, Spec) of
{error, already_present} ->
supervisor:restart_child(my_sup, Spec);
Any -> Any
end
supervisor:which_children/1
次に、すでに終了した子供も返すかどうかわからないという問題があります。
そのため、一時的に終了した後に子を削除するのが最善です。
どういうわけか、これはすべて私にとってエレガントではないので、私は自分自身(そしてあなた)に尋ねています:
これを最もエレガントに解決するにはどうすればよいですか?
この状況では、スーパーバイザをまったく使用しない方がよいでしょうか?