在Windows上模拟进程替æ¢çš„ç†æƒ³æ–¹æ³•æ˜¯ä»€ä¹ˆï¼Ÿ

时间:2018-07-05 07:00:12

标签: windows winapi optimization process

因此,在feature request I filed against Node.js中,我正在寻找一ç§å°†å½“å‰Node进程替æ¢ä¸ºå…¶ä»–进程的方法。在Linux和朋å‹ï¼ˆå®žé™…上是任何POSIX兼容系统)中,这很容易:使用execve和朋å‹å¹¶ç§°å…¶ä¸ºä¸€æ—¥ã€‚但是很明显,这在Windows上ä¸èµ·ä½œç”¨ï¼Œå› ä¸ºå®ƒåªæœ‰CreateProcess(execve和朋å‹å§”托给complete with async behavior的用户)。它ä¸åƒpeople haven't wanted to do similar,导致numerous duplicate questions on this site。 (这ä¸æ˜¯é‡å¤çš„,因为它在给定é™åˆ¶çš„情况下明确地寻求解决方法,而ä¸ä»…仅是è¦æ±‚直接替æ¢ã€‚)

æµç¨‹æ›¿æ¢æœ‰å‡ ä¸ªæ–¹é¢å¿…须解决:

  1. 所有控制å°I / Oæµéƒ½å¿…须转å‘到新进程。
  2. 所有信å·éƒ½éœ€è¦é€æ˜Žåœ°è½¬å‘到新æµç¨‹ã€‚
  3. 必须销æ¯æ—§è¿‡ç¨‹ä¸­çš„æ•°æ®ï¼Œå¹¶å›žæ”¶å°½å¯èƒ½å¤šçš„资æºã€‚
  4. 所有先å‰å­˜åœ¨çš„线程和å­è¿›ç¨‹å‡åº”销æ¯ã€‚
  5. 除了打开的文件æ述符和命å管é“/等以外,所有已有的å¥æŸ„都应销æ¯ã€‚
  6. ç†æƒ³æƒ…况下,创建旧进程åŽï¼Œåº”将旧进程的内存ä¿æŒåœ¨æœ€ä½Žæ°´å¹³ã€‚
  7. 对于我的特定用例,ä¿ç•™è¿›ç¨‹ID并ä¸é‡è¦ã€‚

对于我的特殊情况,有一些约æŸæ¡ä»¶ï¼š

  1. 我å¯ä»¥æŽ§åˆ¶åˆå§‹æµç¨‹çš„å¯åŠ¨ä»¥åŠâ€œæµç¨‹æ›¿æ¢â€åŠŸèƒ½çš„ä½ç½®ã€‚
  2. 我å¯ä»¥é€šè¿‡æ’件以任æ„堆栈å移é‡åŠ è½½ä»»æ„本机代ç ã€‚
    • å«ä¹‰ï¼šæˆ‘什至无法梦想跟踪malloc调用,å¥æŸ„,线程æ“作或进程æ“作以跟踪并释放所有这些æ“作,因为DLLé‡å†™å¹¶ä¸å®Œå…¨å¯è¡Œã€‚
  3. 我无法控制何时调用“æµç¨‹æ›¿æ¢â€ã€‚å¯ä»¥é€šè¿‡é™„加组件æ¥è°ƒç”¨å®ƒï¼Œå®ƒå¯ä»¥é€šè¿‡FFI的解释代ç ç”šè‡³å¯ä»¥é€’归地通过å¦ä¸€ä¸ªé™„加组件æ¥è°ƒç”¨ã€‚甚至å¯ä»¥åœ¨é™„加åˆå§‹åŒ–期间调用它。
    • å«ä¹‰ï¼šå³ä½¿æˆ‘完美地装备了自己的身体,我也无法知é“堆栈中的内容。并且é‡å†™å…¶æ‰€æœ‰callå’Œpush都是ä¸åˆ‡å®žé™…的,并且由于明显的原因,这将是缓慢的。

所以,这就是我在想的主旨:使用类似于å‡è¹¦åºŠçš„东西。

  1. é™æ€åˆ†é…以下内容:
    1. 用于堆栈指针的å•ä¸ªæŒ‡é’ˆã€‚
    2. MAX_PATH + 1表示应用程åºè·¯å¾„的字符+ '\0'。
    3. MAX_PATH + 1表示当å‰å·¥ä½œç›®å½•è·¯å¾„+ '\0'的字符。
    4. å‚æ•°+ '\0'çš„32768个字符。
    5. 环境的32768个字符+ '\0'。
  2. 在进入时,将全局堆栈指针引用设置为堆栈指针。
  3. 关于“替æ¢â€ï¼š
    1. 进行相关的进程清ç†å¹¶é”定/释放所有å¯èƒ½çš„内容。
    2. 将堆栈指针设置为存储的原始全局指针。
    3. 终止æ¯ä¸ªå­çº¿ç¨‹ã€‚
    4. æ€æ­»æ¯ä¸ªå­è¿›ç¨‹ã€‚
    5. å…è´¹each open handle。
    6. 如果å¯èƒ½çš„è¯ï¼ˆå³ä¸åœ¨UWP程åºä¸­ï¼‰ï¼ŒFor each heap,destroy it(如果ä¸æ˜¯default heap或临时堆(如果存在)的è¯ï¼‰ã€‚
    7. 如果å¯èƒ½ï¼Œè¯·å…³é—­each open handle。
    8. 如果å¯èƒ½ï¼Œè¯·walk默认堆,并free与之关è”çš„æ¯ä¸ªæ®µã€‚
    9. 使用é™æ€åˆ†é…的文件/å‚æ•°/环境/等创建新进程。没有创建新窗å£ã€‚
    10. 代ç†æ‰€æœ‰å°†æ¥æ”¶åˆ°çš„ä¿¡å·ï¼Œå¼‚常等,而无需以æŸç§æ–¹å¼å¯¹æ­¤è¿‡ç¨‹è¿›è¡Œä¿®æ”¹ã€‚ The standard signals are easy,但例外情况ä¸å¤šã€‚
    11. 等待过程结æŸã€‚
    12. 返回the process's exit code。

这里的想法是使用基于过程的蹦床,并在å¯åŠ¨æ–°åˆ›å»ºçš„蹦床时将当å‰è¿‡ç¨‹çš„大å°é™è‡³ç»å¯¹æœ€å°ã€‚

但是在我ä¸å¤ªç†Ÿæ‚‰Windows的地方,我å¯èƒ½åœ¨è¿™é‡ŒçŠ¯äº†å¾ˆå¤šé”™è¯¯ã€‚å¦å¤–,上述内容似乎æžå…¶æ•ˆçŽ‡ä½Žä¸‹ï¼Œå¹¶ä¸”在æŸç§ç¨‹åº¦ä¸Šæ¥è¯´ï¼Œè¿™å¯¹äºŽå†…æ ¸å¯ä»¥é‡Šæ”¾ä¸€äº›å†…存页é¢ï¼Œå–消分é…一堆内存å¥æŸ„并为下一个内存分é…一些内存而感到éžå¸¸é”™è¯¯ã€‚过程。

因此,总而言之,在é™åˆ¶æœ€å°‘çš„Windows上模拟进程替æ¢çš„ç†æƒ³æ–¹æ³•æ˜¯ä»€ä¹ˆï¼Ÿ

2 个答案:

答案 0 :(得分:0)

Windows有execve()和朋å‹ï¼Œè¯·å‚阅:

https://docs.microsoft.com/en-gb/cpp/c-runtime-library/reference/execve-wexecve

æ®æˆ‘所知(除了Windows没有信å·çš„事实),这些信å·ä¸ŽPOSIX版本具有相åŒçš„语义,所以您为什么还è¦å¯»æ‰¾å…¶ä»–东西?

-或-

(å¯èƒ½æ›´å¥½ï¼Œå› ä¸ºå®ƒå¯ä»¥è®©æ‚¨æ›´å¥½åœ°æŽ§åˆ¶å½“å‰è¿›ç¨‹ä¸­æ‰“开的å¥æŸ„是å¦åº”由正在生æˆçš„进程继承):

  1. CreateProcess (...);
  2. ExitProcess (...);

如果生æˆçš„过程需è¦æµ·æ‹”,则å¯èƒ½éœ€è¦ç”¨ShellExecute()替æ¢æ­¥éª¤1。

通过这ç§æ–¹å¼è¿›è¡Œæ“作å¯è®©æ‚¨è®¿é—®â€œè£¸æœºâ€ Windows API。 别无他法。您å¯èƒ½ç”¨æ¥ç”Ÿæˆæ–°è¿›ç¨‹çš„任何其他API(包括exec系列)都建立在CreateProcess()之上。

您所有的“蹦床â€ä¸œè¥¿éƒ½â€¦â€¦å¾ˆå¥‡æ€ªã€‚请ä¸è¦åŽ»é‚£é‡Œï¼Œå®ƒæ°¸è¿œä¸ä¼šå·¥ä½œï¼ˆæ— è®ºå®ƒæ˜¯ä»€ä¹ˆï¼‰

答案 1 :(得分:0)

鉴于我ä¸ç†è§£å®žé™…è¦æ±‚的内容,我肯定会以“执行者â€è¿™æ ·çš„眼光看待“执行者â€ï¼Œå°½ç®¡å¦‚此,我ä»ç„¶ä¼šçœ‹å¾…è¿™ç§æƒ…绪。通过问自己这个问题:

如果进程-a被æ€æ­»å¹¶è¢«å‡ ä¹Žç›¸åŒçš„进程-bå–代-会注æ„到è°æˆ–什么?

任何拥有进程ID或进程å¥æŸ„的东西都一定会注æ„到。这å¯ä»¥é€šè¿‡ç¼–写包装器应用程åºæ¥å¤„ç†ï¼Œè¯¥åº”用程åºå°†åŠ è½½ç¬¬ä¸€ä¸ªèŠ‚点进程,并在å—到æ示时将其æ€æ­»å¹¶åŠ è½½ä¸‹ä¸€ä¸ªè¿›ç¨‹ã€‚外部观察者会看到包装过程的å¥æŸ„,并且idä¸å˜ã€‚

显然,这将切断馈入节点应用程åºçš„stdinå’Œstdoutæµã€‚但是åŒæ ·ï¼ŒåŒ…装器进程å¯ä»¥é€šè¿‡å°†ç›¸åŒçš„å¯ç»§æ‰¿å¥æŸ„集传递给通过正确填充传递到STARTUPINFOçš„{​​{1}}结构而å¯åŠ¨çš„æ¯ä¸ªèŠ‚点进程æ¥è§£å†³æ­¤é—®é¢˜ã€‚

Windowsä¸æ”¯æŒä¿¡å·ï¼Œè€ŒMS Cè¿è¡Œæ—¶ä¼ªé€ çš„ä¿¡å·å‡å¤„ç†å†…部错误,唯一的错误是通过ctrl-C关闭了一个交互å¼æŽ§åˆ¶å°çª—å£ï¼Œæ´»åŠ¨çš„Node.js应用程åºå¯ä»¥ç¡®å®šæ­¤é”™è¯¯ä»ç„¶å¯ä»¥èŽ·å–-或å¯ä»¥ä»ŽåŒ…装器传递,因为使用这ç§æ–¹æ³•å®žé™…上ä¸ä¼šåœ¨äº¤äº’å¼æŽ§åˆ¶å°ä¸Šè¿è¡ŒèŠ‚点应用程åºã€‚

除此之外,其他所有内容似乎都是Node.js应用程åºçš„内部细节,因此ä¸åº”å½±å“任何第三方应用程åºé€šè¿‡å…¶stdin / stdoutæµä¸Žå…¶è®¤ä¸ºæ˜¯å•èŠ‚点应用程åºçš„通信。

相关问题