我有一个类似于以下内容的二进制文件:
int RealMain() {
... runs forever ...
}
int main() {
clone(RealMain, ..., CLONE_NEWPID /*clone flags*/, ...);
_exit(0);
}
想法是启动一个通过clone()启动实际进程并退出的进程。此模型的原因是“CLONE_NEWPID”标志。我需要应用程序在单独的PID命名空间中运行。因此,需要使用CLONE_NEWPID标志通过克隆创建实际的应用程序进程。
当我从命令行启动这个二进制文件时,一切运行良好。但是当我通过Upstart启动它时,clone()失败,errno设置为EPERM,并且永远不会创建新的PID命名空间。由于上面的clone()调用,我在Upstart配置中使用“expect fork”。这样我就可以将活动与执行RealMain()的子进程的生命周期联系起来。
expect fork
respawn
我想知道“expect fork”的实现与使用CLONE_NEWPID创建新的PID命名空间之间是否存在一些不良的交互。我找到了关于“expect fork”和ptrace问题的以下来源,但没有发现其他人报告了CLONE_NEWPID的问题:
https://blueprints.launchpad.net/ubuntu/+spec/foundations-q-upstart-overcome-ptrace-limitations
由于