2011-03-12 43 views
2

沒有這個問題需要的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也返回已終止孩子的問題。

因此,如果孩子在他們暫時終止後被刪除,那將是最好的。

不知怎的,這一切的感覺不雅給我,讓我問自己(和你):

我怎樣才能最優雅的解決呢?

在這種情況下最好不要使用監督員嗎?

回答

2

我的直覺/膝關節反應是:'你需要爲他們使用一個simple_one_for_one'主管,所以他們的規格在停止時被移除。如果您需要能夠獲取特定的通信流程,那麼我會使用該應用程序(或ETS表格)。

+0

simple_one_for_one的問題在於,找到哪些地址缺少進程並不容易。我必須實施一個單獨的地址註冊表來監視過程。那麼simple_one_for_one主管服務的目的是什麼? – 2011-03-13 00:20:56

+0

gproc聽起來確實很適合這個BTW – 2011-03-13 01:43:53

+0

simple_one_for_one管理程序在那裏掛鉤進程,所以如果其他進程死了,你可以正常關閉USB鏈接。這是爲了清理,沒有別的。 – 2011-03-13 12:35:12

1

這聽起來像你想要動態添加到你的主管的孩子們彼此非常相似。也許simple-one-for-one主管是你需要的。這些主管是「one_for_one主管的簡化版本,其中所有子進程都是動態添加同一進程的實例。」每個孩子都會有相同的孩子規格,所以當你致電supervisor:add_child/2時,你不需要指定它。

此外,請注意,動態創建原子的上述想法(例如adr_12)可能會很危險。 Erlang系統中的原子是有限的(默認爲〜1000000)。詳情請參閱文檔。

+0

USB總線上只有127個可能的地址,只有低地址被使用過 - >所以創建一個原子不成問題 – 2011-03-13 00:18:31

+0

當然。我只是認爲提及這個問題是有用的 - 有人可能會看到這個問題,並認爲對更多的兒童使用相同的方法 - – 2011-03-13 00:20:50

+0

請同時看到我對@ IGCA的回答的評論 – 2011-03-13 00:21:33

相關問題