1

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

4

3 回答 3

2

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

其实原因clone(2)就是为了实现线程。

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

一旦您开始为每个进程设置堆栈,那么您不妨只使用 posix 线程库。

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

于 2009-10-30T00:20:32.030 回答
0

为什么不将应用程序编译成同一个可执行文件,然后将它们作为 main 中的线程启动呢?

无论如何,将它们作为单独的任务运行有什么问题?如果您真的愿意,您仍然可以共享内存。

于 2009-10-30T07:59:54.280 回答
0

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

好吧,如果您愿意编写自己的自定义 ELF 加载器并模拟内核通常为进程所做的许多事情,这是可能的。

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

于 2009-11-06T01:37:57.900 回答