沒有這個問題需要的USB知識,只是描述它,因爲它是爲了讓這個例子更具針對性。如何自動刪除動態主管中被終止的孩子的規格
我試圖爲USB總線上的特定設備實現動態管理器。 這些設備具有地址,並在系統的生命週期內出現並消失。
對於每個設備,我需要一個動態孩子給我的主管。
這些孩子是短暫的,所以一旦他們崩潰或終止,我們不會重新啓動他們(因爲他們可能已經消失了)。
我有一個過程,在特定時間掃描USB端口,併產生我想處理的USB設備的所有地址的列表。
我打算在每次掃描之前調用supervisor:which_children/1
以確定哪些設備存在但沒有子進程正在運行。
爲了找出哪些地址有子女運行,我計劃爲包含地址的childspec創建Id原子(只有少數地址可能) adr_12
如果孩子處理地址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
也返回已終止孩子的問題。
因此,如果孩子在他們暫時終止後被刪除,那將是最好的。
不知怎的,這一切的感覺不雅給我,讓我問自己(和你):
我怎樣才能最優雅的解決呢?
在這種情況下最好不要使用監督員嗎?
simple_one_for_one的問題在於,找到哪些地址缺少進程並不容易。我必須實施一個單獨的地址註冊表來監視過程。那麼simple_one_for_one主管服務的目的是什麼? – 2011-03-13 00:20:56
gproc聽起來確實很適合這個BTW – 2011-03-13 01:43:53
simple_one_for_one管理程序在那裏掛鉤進程,所以如果其他進程死了,你可以正常關閉USB鏈接。這是爲了清理,沒有別的。 – 2011-03-13 12:35:12