1.16. 我怎样杀死一个进程的所有派生进程?

没有一个完全普遍的方法来做这个。虽然你可以通过处理‘ps’的输出确定进 程间的相互关系,但因为它只表示系统的一瞬间的状态(snapshot)所以并不可靠。

但是,如果你启动一个子进程,而它可能生成它自己的子进程,而你意图一次杀 死整个生成的事务(job),解决方法是将最先启动的子进程置于一个新的进程组, 当你需要时杀死整个进程组。

建议为创建进程组而使用的函数是‘setpgid()’。在可能情况下,使用这个函数 而不使用‘setpgrp()’,因为后一个在不同系统中有所不同(在一些系统上‘setgrp();’ 等同于‘setpgid(0,0);’,在其它系统上,‘setpgrp()’和‘setpgid()’相同)。 参见范例章节的事务-控制范例程序。

放置一个子进程于其自身的进程组有一些影响。特别的,除非你显式地将该进程 组放置于前台,它将被认为是一个后台事务并具有以下结果:

在很多应用程序中输入和输出总会被重定向,所以最显著的影响将是丧失键盘 信号。父进程需要安排程序起码捕获‘SIGINIT’和‘SIGQUIT’(可能情况下, 还有‘SIGTERM’),并在需要情况下清除后台事务。