我有一個有趣的(至少對我來說)問題:在某些情況下,我無法設法找到一種可靠且便攜地獲取有關孫輩過程的信息的方法。我有一個應用程序,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
機制的想法真的是唯一的選擇,我有短修補內核(這是不去的想法即將發生)。
Hrm。我會仔細研究一下,看看會發生什麼。這個想法聽起來不錯,但。是否有任何理由創建一個新的單一流程組是不夠的?目前AllTray只管理一個應用程序,它最終會管理更多,但如果一個單一的pgid可以完成這項工作只是爲了找到它應該關注的過程,那麼我認爲就足夠了。 – 2009-06-11 17:22:32