是否可以使用Linux的clone()系统调用在同一地址空间中运行多个应用程序?

时间:2009-10-29 23:46:47

标签: linux linker exec fork system-calls

如果未将CLONE_VM标志传递给clone(),则新进程与原始进程共享内存。这可以用于在同一个进程中运行两个不同的应用程序(两个main())吗?理想情况下,这就像使用CLONE_VM调用clone()然后调用exec()一样简单,但我意识到它可能更复杂。至少,我假设生成的应用程序需要编译为可重定位(-fPIC)。我意识到我总是可以将应用程序重新编码为库,并创建一个主应用程序,将其他'应用程序'作为线程生成,但我很好奇这种方法是可行的。

3 个答案:

答案 0 :(得分:2)

嗯,是的,这就是线程,减去“两个不同的main()/ application”部分。

事实上,clone(2)的原因是实现线程。

Clone(2)或多或少要求你声明一个单独的堆栈(如果你不生成一个堆栈),因为没有它,孩子将无法在不破坏它的情况下从当前的调用级别返回父母的堆栈。

一旦开始为每个进程设置堆栈,那么你也可以使用posix线程库。

对于加载了两个不同应用程序的部分,调用execve(2)很可能不是这样做的方法。这些天内核无论如何都没有准确地运行程序。更典型的是,映像设置为运行Elf动态加载器,这就是内核真正运行的全部内容。然后加载器mmaps(2)将进程及其库放入地址空间。当然可以这样做以获得“两个不同的应用程序”,并且线程调度程序很乐意通过clone(2)将它们作为两个进程运行。

答案 1 :(得分:0)

为什么不将应用程序编译成相同的可执行文件,并将它们作为主要的线程启动?

无论如何,将它们作为单独的任务运行会出现什么问题?如果你真的想要,你仍然可以分享记忆。

答案 2 :(得分:0)

简短回答:这是不可能的。

嗯,如果您愿意编写自己的自定义ELF加载程序并模拟内核通常为进程执行的许多操作,那么这是可能的。

最好将每个应用程序编译成一个库,该库只公开一个函数main(重命名为其他函数)。然后主存根程序应链接到两个库并调用每个库的导出函数。