-1

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

我曾经通过使用 killall 或 pkill -u 以及附加到沙盒的唯一用户来执行此操作。但它似乎不适用于快速使用 fork() 的程序。

然后我搜索了pkill的源代码,发现pkill是失去原子性的。

那么我怎样才能实现我的目标呢?

4

1 回答 1

2

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

阅读像Advanced Linux Programming这样的好书。还可以考虑使用chroot(2)

并解释你真正想做的事情和原因。沙盒比你想象的要难。另见能力(7)凭据(7)SElinux

于 2013-08-10T05:48:25.143 回答