这个问题不需要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
也返回已经终止的孩子的问题。
因此,最好在子节点暂时终止后将其删除。
不知何故,这一切对我来说都是不雅的,所以我问自己(和你):
我怎样才能最优雅地解决这个问题?
在这种情况下完全不使用主管会更好吗?