2009-06-11 66 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