我正在linux上开发一个沙箱。现在我很困惑终止沙箱中的所有进程。我的沙箱工作如下:起初只有一个进程在沙箱中运行。然后它可以创建几个子进程。子进程也将创建他们的子进程。并且父进程可能会在其子进程退出之前的某个时间退出。最后沙箱将终止所有进程。
我曾经通过使用 killall 或 pkill -u 以及附加到沙盒的唯一用户来执行此操作。但它似乎不适用于快速使用 fork() 的程序。
然后我搜索了pkill的源代码,发现pkill是失去原子性的。
那么我怎样才能实现我的目标呢?
我正在linux上开发一个沙箱。现在我很困惑终止沙箱中的所有进程。我的沙箱工作如下:起初只有一个进程在沙箱中运行。然后它可以创建几个子进程。子进程也将创建他们的子进程。并且父进程可能会在其子进程退出之前的某个时间退出。最后沙箱将终止所有进程。
我曾经通过使用 killall 或 pkill -u 以及附加到沙盒的唯一用户来执行此操作。但它似乎不适用于快速使用 fork() 的程序。
然后我搜索了pkill的源代码,发现pkill是失去原子性的。
那么我怎样才能实现我的目标呢?
您可以使用进程组setpgid(2)和会话setsid(2),但我不限定您作为沙箱所做的事情(特别是因为如果其中一个进程是setuid或更改其进程组或会话本身,您会丢失它;仔细阅读execve(2)并多次阅读!)。请注意,带有负 pid 的kill(2)会杀死整个进程组。
阅读像Advanced Linux Programming这样的好书。还可以考虑使用chroot(2)。