终止LInux中的所有子进程



我正在linux上开发一个沙箱。现在我对终止沙箱中的所有进程感到困惑。我的沙箱工作原理如下:起初只有一个进程在沙箱中运行。然后它可以创建几个子进程。子流程也将创建它们的子流程。并且父进程可能在其子进程退出之前的某个时间退出。最后沙箱将终止所有进程。

我过去常常使用killall或pkill-u来实现这一点,并在沙箱中附加一个唯一的用户。但它似乎不适用于快速使用fork()的程序。

然后我搜索pkill的源代码,意识到pkill失去了原子性。

那么我该如何实现我的目标呢?

您可以使用进程组setpgid(2)和会话set_id(2),但我不认为您所做的是沙盒(特别是因为如果其中一个进程是setuid或更改其进程组或会话本身,您将丢失它;请仔细阅读execve(2)并多次!)。请注意,带有负pid的kill(2)会杀死整个进程组。

读一本像《高级Linux编程》这样的好书。还可以考虑使用chroot(2)。

并解释你真正想做什么以及为什么。沙箱比你想象的更难。另请参阅功能(7)、凭据(7)和SElinux。

最新更新