Isi*_*ows 6 windows optimization winapi process
因此,在我针对 Node.js 提交的功能请求中,我正在寻找一种用另一个节点替换当前 Node 进程的方法。在Linux 和朋友(实际上是任何兼容POSIX 的系统)中,这很简单:使用execve和朋友,就到此为止。但显然,这在 Windows 上不起作用,因为它只有CreateProcess(它execve和朋友委托给,完成异步行为)。人们 并不是不想 做 类似的事情,导致 该网站上出现大量重复的问题。(这不是重复的,因为它在给定某些限制的情况下明确寻求解决方法,而不仅仅是要求直接替换。)
流程替换有几个方面需要解决:
对于我的具体情况,有一些限制:
malloc调用、句柄、线程操作或进程操作来跟踪和释放它们,因为 DLL 重写并不完全实用。calls 和pushes 是不切实际的,而且由于显而易见的原因,速度会很慢。所以,这就是我的想法的要点:使用类似于伪蹦床的东西。
MAX_PATH + 1应用程序路径的字符 + '\0'.MAX_PATH + 1当前工作目录路径的字符 + '\0'.'\0'。'\0'.这里的想法是使用基于进程的蹦床,并在新创建的进程启动时将当前进程大小降至绝对最小值。
但由于我对Windows不太熟悉,所以这里可能犯了很多错误。另外,上面的方法似乎效率极低,并且在某种程度上,对于内核可以释放一些内存页、释放一堆内存句柄并为下一个进程移动一些内存的事情来说,它感觉非常错误。
那么,总而言之,在 Windows 上模拟进程替换且限制最少的理想方法是什么?
Chr*_*cke -8
鉴于我不明白实际要求的是什么,而且我当然会带着“谁到底会这么称呼它,除了疯狂之外什么也不会产生”的情绪来看待像“execve”这样的东西,尽管如此,我还是通过以下方式看待这个问题:问自己:
如果进程 a 被杀死并被几乎相同的进程 b 取代 - 谁或什么会注意到?
任何持有进程 ID 或进程句柄的东西肯定会注意到。这可以通过编写一个包装应用程序来处理,该应用程序加载第一个节点进程,并在被刺激时杀死它并加载下一个节点进程。外部观察者看到包装进程句柄和 id 没有变化。
显然,这会切断输入节点应用程序的标准输入和标准输出流。但是,包装器进程可以通过将相同的一组可继承句柄传递给通过正确填充传递到的结构来启动的每个节点进程来解决此STARTUPINFO问题CreateProcess。
Windows 不支持信号,MS C 运行时伪造的信号都处理内部错误,除了一个,它处理通过 ctrl-C 关闭的交互式控制台窗口,活动的 Node.js 应用程序肯定会收到该窗口- 或者可以从包装器传递,因为使用这种方法节点应用程序实际上不会在交互式控制台上运行。
除此之外,其他所有内容似乎都是 Node.js 应用程序的内部细节,因此不应影响任何第三方应用程序通过其 stdin/stdout 流与其认为是单节点应用程序进行通信。