2017-04-10 39 views
0

我正在研究一個內核模塊,我需要「知道」給定的進程崩潰了。當用戶進程終止/接收信號時中斷內核模塊?

現在我的做法是設置內核模塊中的週期性定時器中斷;在每個定時器中斷上,我檢查該進程的task_struct.state和task_struct.exitstate值。

我想知道是否有辦法在內核模塊中設置中斷,當進程終止時,或進程收到給定信號(例如,SIGINT或SIGHUP)時該中斷會關閉。

謝謝!

編輯:這裏的一個前提條件是,我不能修改用戶應用程序。或者至少,這將是一個更加艱難賣給如果我把額外的要求/約束​​的S/W來自其他供應商的客戶...

回答

0

你可以有你的模塊創建一個字符設備節點,然後打開該節點來自您的用戶空間進程。只有大約十幾行樣板可以在您的模塊中註冊一個簡單的cdev。當過程打開設備節點時,將調用cdev的open方法,並且在設備節點關閉時將調用release方法。如果某個進程有意或因信號退出,所有打開的文件描述符都會被內核關閉。所以你可以肯定release將被調用。這避免了輪詢進程狀態的任何需要,並且可以避免修改模塊之外的任何內核代碼。

你也可以設置一個監視系統風格,你的過程中必須每隔一段時間寫一個字節到設備。有cdev的write方法重置一個計時器。如果沒有寫入並且計時器到期時間過長,則假定進程有某種失敗,即使它沒有崩潰並終止。例如一個編程錯誤,它允許互斥鎖死鎖或將進程置於無限循環中。

有在信號被傳送到用戶進程的內核代碼的點。你可以修補它,檢查進程名稱,併發出一個條件變量,如果它匹配。這隻會捕獲信號,而不是有意的流程退出。恕我直言,這是非常醜陋的,你需要處理維護內核補丁。但並不難,只有一點,我不記得有什麼功能,對不起,在哪裏可以插入必要的代碼,它會捕獲所有的信號。

+0

謝謝!這裏有一個問題,我應該提到:我無法修改用戶應用程序。或者至少,這將是一個困難得多出售給客戶,如果我把額外的要求/約束​​的S/W從其他供應商... 也許修補方法是值得看,但我想的複雜性與貿易如果由於週期性定時器中斷導致的性能下降達到可接受性閾值,那麼關閉將是值得的... –

+1

有一個封裝器來啓動應用程序併發信號給你的模塊嗎?如果子進程(應用程序進程)通過'waitpid()'等進程崩潰或退出,進程的父進程(即包裝器)將得到通知。你甚至可以讓包裝打開驅動程序的設備節點,然後exec()應用程序,而不關閉設備節點。孩子將繼承打開的文件描述符並保持打開狀態,直到它關閉或終止。封裝器不需要在啓動應用程序之前存在。 – TrentP