我正在linux上开发一个沙箱。现在我很困惑终止沙盒中的所有进程。 我的沙盒的工作原理如下: 起初只有一个进程在沙箱中运行。 然后它可以创建几个子进程。 并且子进程也将创建它们的子进程。 父母进程可能会在其子女退出之前的某个时间退出。 最后,沙箱将终止所有进程。
我曾经通过使用killall或pkill -u与沙盒上附加的唯一用户来做到这一点。但似乎不能快速使用fork()的程序。
然后我搜索pkill的源代码,并意识到pkill失去了原子性。
那我怎么能实现我的目标呢?
答案 0 :(得分:2)
您可以使用流程组setpgid(2)和会话setsid(2),但我不会将您的操作限定为沙箱(特别是因为其中一个流程是setuid或更改它的进程组或会话本身,你将失去它;仔细阅读execve(2)几次!)。请注意,带有负pid的kill(2)会终止整个进程组。
阅读像Advanced Linux Programming这样的好书。还可以考虑使用chroot(2)。
并解释你真正想做的事情和为什么。 sandboxing比你想象的更难。另请参阅capabilities(7),credentials(7)和SElinux。