我有一个有趣的(至少对我来说)问题:在某些情况下,我无法设法找到一种可靠且便携地获取有关孙辈过程的信息的方法。我有一个应用程序,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