我的程序按时间顺序执行以下操作
- 该程序以 root 权限启动。
- 在其他任务中,编辑了一个只有 root 权限才能读取的文件
open()
。 - 根权限被删除。
- 子进程生成
clone()
并CLONE_FILES | CLONE_FS | CLONE_IO
设置了标志,这意味着虽然它们使用不同的虚拟内存区域,但它们共享相同的文件描述符表(和其他 IO 内容)。 - 所有子进程
execve()
自己的程序(FD_CLOEXEC
不使用该标志)。 - 原程序终止。
现在我希望每个生成的程序都读取上述文件的内容,但是在他们都读取了文件之后,我希望它被关闭(出于安全原因)。
我现在正在考虑的一种可能的解决方案是有一个步骤 3a,其中文件的 fddup()
为每个子进程分配一次,每个子进程都有自己的 fd(作为argv
)。然后每个子程序都会简单地close()
使用他们的 fd,以便在所有指向文件的 fd 都是close()
d 之后,“实际文件”被关闭。
但它是这样工作的吗?这样做是否安全(即文件是否真的关闭了)?如果没有,是否有另一种/更好的方法?