2013-07-22 76 views
2

我在內核空間工作,我想搞清楚當應用程序已經停止或崩潰。 當我收到一個ioctl調用時,我可以得到struct task_struct,其中有很多關於應用程序進程的信息。 我的問題是,我想定期檢查進程是否還活着或更好,當進程被終止時有一些異步調用。linux內核檢查,如果進程仍在運行

我的測試環境在QEMU上,並且在應用程序中運行一段時間後,我運行了一個系統(「kill -9 pid」)。同時在內核中,我對task_struct進行了定期檢查:
易失性長狀態;/* -1 unrunnable,0可運行,> 0 *停止/
靜態內聯INT pid_alive(結構的task_struct * P)

的問題是,我的task_struct的指針似乎是不變。通常我會說每個進程都有一個task_struct,當然它與進程狀態一致。否則,我沒有看到的「揮發性長狀態」

我缺少什麼意義呢?難道我在QEMU上測試,是我測試了一下while(1)中的task_struct,它的msleep爲100?任何幫助,將不勝感激。

我會很開心部分,如果當應用程序被關閉模塊(「的/ dev /驅動器」)的文件描述符我無法接受應用程序的PID。

謝謝!

回答

0

以來,它一直我搞亂周圍的內核中很長一段時間。在我看來,如果你的流程實際上是就會死掉,那麼你最好的辦法就是把鉤子放入代碼中去掉流程。如果它不會死掉,但會陷入一個無響應的循環中,那麼導致應用程序級核心轉儲可能會更好。

1

不能分出的task_struct指針和引用它以後。如果進程已被殺死,指針不再有效 - task_struct不見了。你也不應該在內核中使用PID值來引用進程。 PID值被重新使用,所以你甚至可能不會談論相同的過程。

您的驅動器可以提供一個.release回調,當你的驅動程序文件被關閉,如果該進程被終止或被殺,包括將被調用。您可以從此回調訪問current。請注意,如果某個進程打開文件然後分叉,則調用.release的進程可能與調用.open的進程有所不同。您的驅動程序必須能夠處理此問題。

相關問題