2011-05-13 53 views
0

我有一個守護進程,我不斷啓動並在循環中執行'kill -9'以強調測試特定用例。這個守護進程加載一個共享庫,然後打開一個fd。 (fd的打開/關閉是在內核中處理的另一個共享庫代碼中)。我觀察到,在內核庫中進行清理操作時,它會在清理之前從task_structs(tgid)檢查PID值。 現在我的觀察:我有時看到,當守護進程被殺死時,我沒有看到相關的tgid值,而是看到一個奇怪的進程ID值,它是'binder進程'。因此,我在內核代碼中的清理操作對於那些直接被'kill -9'殺死的進程ID不起作用Android:tgid task_struct val

任何人都知道爲什麼current-> tgid值是一個活頁夾進程的值,而不是被殺死的守護進程。請注意我的守護進程鏈接到'libbinder'。不知道這是否會有所作爲。如果我刪除鏈接到我的守護進程'libbinder'及其相關代碼,一切似乎都很好

任何建議/想法請嗎?

回答

0

如果你的用戶空間進程打開一個文件,然後分叉另一個進程,打開的文件將被複制到分叉進程中(看起來很可能這個libbinder正在分離另一個進程)。

內核中的file_operations結構的關閉方法只會在對該文件的引用上一個被引用時才被調用。如果兩個進程都在同一時間死亡,那麼結束調用close方法的進程將是發生死亡的那一個。

你的內核代碼應該是而不是可以鍵入tgid。它應該將清理操作所需的數據附加到struct file,而不是task_struct

+0

此信息當然有幫助。感謝你的回答 – Siddartha 2011-05-18 01:49:00