【问题标题】:Start child process process inside parent process在父进程内启动子进程进程
【发布时间】:2016-02-10 17:10:25
【问题描述】:

是否可以在同一地址空间内启动子进程? 我想在本地访问任何导出的函数。

例如:

  1. 启动(启动器)进程(父进程)。
  2. (启动器)调用 CreateProcess(...)(子进程)

但是子进程会有一个新的地址空间,对吗?有没有办法在父进程地址空间内创建进程?我知道可以从外部访问它,但希望以优雅的方式进行。

【问题讨论】:

  • 这是什么原理?
  • 我想从地址空间访问导出的函数。
  • 一个DLL被映射到其调用进程的地址空间,我认为我的第一个问题仍然适用
  • 但这是另一个可执行文件,不是动态库,我可以将它映射到父进程,但它的目的是什么,因为我仍然无法运行它。
  • @user2887378 你可能应该improve your question 并多谈谈你的动机。因为它是你有一个XY问题。据我所知,您的 cmets 存在问题,您需要将专有(未公开)代码与 GPL 共享库连接起来。

标签: c++ windows winapi


【解决方案1】:

是否可以在同一地址空间内启动子进程?我想在本地访问任何导出的函数。

不,这是不可能的。操作系统为每个进程创建一个新的地址空间,该地址空间受到保护以防止其他进程访问。

改用线程。

【讨论】:

  • 是的,但它必须是另一个可执行文件,因为子进程使用 GPL 许可,如果不打开源代码,我无法加载任何动态库,但必须关闭此代码。我需要将 dll 注入到子进程中,谢谢。
  • @user2887378 好吧,然后尝试获取使用 LGPL 许可证的东西,或者将这些东西包装在单独的进程中并使用 IPC 机制(可能是共享内存)。
  • @user2887378:GPL 没有区分进程或库。它所关心的是,如果您直接使用 GPL 版本的代码。从不同的进程映像直接调用函数仍将被 GPL 视为库链接。
  • @datenwolf 我第一个也是这么认为的,但是 OP 声明 DLL 将被链接到一个单独的可执行文件中。
  • 我提到了另一个可执行文件而不是动态库,子进程 (gpl) 导出了一个函数,我将从父进程中调用它。
【解决方案2】:

我想在本地访问任何导出的函数。

您不需要子进程与父进程共享相同的内存空间。使用父进程的可执行文件调用LoadLibrary 将使子进程能够访问父进程中导出的入口点。请注意,这不会提供共享内存的机制(除非您实际使用shared memory)。

【讨论】:

  • 是的,我打算使用共享内存或将模块注入子进程,只是想确定这是否可能。感谢 @MooseBoys 提供 LoadLibrary 信息,谢谢。
猜你喜欢
  • 2015-09-20
  • 2011-01-04
  • 2017-08-09
  • 2014-06-25
  • 2017-03-07
  • 1970-01-01
  • 1970-01-01
  • 2013-08-11
  • 1970-01-01
相关资源
最近更新 更多