2009-06-11 55 views
3

我有一個有趣的(至少對我來說)問題:在某些情況下,我無法設法找到一種可靠且便攜地獲取有關孫輩過程的信息的方法。我有一個應用程序,AllTray,我試圖在某些奇怪的情況下工作,其中的子進程產生了一個孩子,然後死亡。 AllTray的工作基本上是將應用程序停靠在任務托盤上,任務托盤(通常)被指定爲AllTray要調用的命令行(即,alltray xterm將啓動xterm並在AllTray中管理它)。我如何可靠地跟蹤POSIX系統上的子/孫進程?

大多數的GUI軟件運行在它就好了。它在其窗口(或小部件庫)上設置了_NET_WM_PID屬性,並且一切正常,因爲_NET_WM_PID == fork() ed子。然而,在某些情況下(運行時oowriter或軟件寫入KDE,比如k3b下運行如),即AllTray運行是一個包裝的子進程,無論是shell腳本(如OO.o的情況下)或一個奇怪程序fork() s和exec()本身和有效的背景本身,因爲父母過程很早就死亡。

我的想法是不收穫我的子進程,以便在進程表中保留我的孫輩的父進程ID,這樣我就可以通過從下到上的遍歷系列樹將它們鏈接回我,最佳。但這並不奏效,一旦我的子進程死亡並變成殭屍,系統會認爲我的孫子進程是一個孤兒,並且它會採用它。至少在Linux 2.6和NetBSD上看起來就是這種情況;我認爲這可能是常態,而且POSIX似乎沒有說明情況如此,所以我希望得到相反的結果。

由於這種方法是行不通的,我想過用LD_PRELOAD和攔截我的子進程的調用fork(),並通過信息反饋給我的父進程。但是,我擔心這不會像理想的解決方案那樣便攜,因爲不同的系統對於動態鏈接器如何執行諸如LD_PRELOAD的事情有不同的規則。它不適用於setuid/setgid GUI應用程序,至少在Linux系統上,輔助函數庫也可以是setuid或setgid。一般來說,它對我來說是一個糟糕的主意,而且感覺非常噁心。

所以,我希望有人對如何做到這一點,或者依靠像LD_PRELOAD機制的想法真的是唯一的選擇,我有短修補內核(這是去的想法即將發生)。

回答

1

你可以調查使用process groups跟蹤的,那麼,進程組的可能性。進程組是一個屬性(只是一個數字),您可以在分支之前設置該屬性,然後子進程會自動繼承它。

AllTray可以創建新的進程組爲每個應用程序啓動它。您可以將信號發送給進程組的所有成員。我想這裏最有用的信號是TERM和KILL,以殺死在AllTray中管理的應用程序。

我不知道是否有弄清楚,如果進程組的所有成員都已經退出與否的便捷方式。您可能不得不通過整個流程列表並針對每個流程調用getpgid以查看流程組中是否有任何剩餘流程。

注意進程組不會爲它創建新的進程組自己的應用程序。但這是相對罕見的,你可能不需要擔心這種應用程序。

+0

Hrm。我會仔細研究一下,看看會發生什麼。這個想法聽起來不錯,但。是否有任何理由創建一個新的單一流程組是不夠的?目前AllTray只管理一個應用程序,它最終會管理更多,但如果一個單一的pgid可以完成這項工作只是爲了找到它應該關注的過程,那麼我認爲就足夠了。 – 2009-06-11 17:22:32