Windows中进程A创建了另一个进程B,那么进程A就是进程B的父进程,B就是A的子进程。
在每一个进程的内存数据结构中,只保存了其父进程的Pid(Parent ProcessId),即使父进程被关闭了,这个存储父进程Pid的字段也不会更新,因此很多情况下通过父进程Pid很可能找不到任何一个进程(即父进程已经关闭或者异常退出)。
当然这并不是什么大问题,因为目前并没有什么东西需要依赖这个父进程Pid。
通过一个简单实验来说明进程树还有进程之间的关系,我们需要用到ProcessExplorer这个工具(网上随便可以下载到)。
首先开一个cmd窗口,使用title Parent修改一下cmd的Window Title,然后使用startcmd开一个子cmd窗口:
使用title Child修改子窗口的Title,然后使用start cmd再开一个子窗口:
为新的子窗口修改Title:
在ProcessExplorer中查看窗口的层级关系:
我们尝试以“结束进程树”的方式来结束Pid为852100的父进程:
结束后,可以发现,三个cmd窗口都关闭掉了。
我们再做一个实验,仍然是开3个cmd(Parent=>Child=>GrandChild),创建好之后,我们把Child这个cmd先关闭掉,然后我们查看ProcessExplorer:
关闭前:
关闭后:
可以看到,关闭后,GrandChild这个窗口变成了一个独立的进程,相当于这个进程树被打断了,这时我们再去对Parent窗口结束进程树的话,GrandChild窗口就不会随之结束了。