å› æ¤ï¼Œåœ¨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。 (这ä¸æ˜¯é‡å¤çš„ï¼Œå› ä¸ºå®ƒåœ¨ç»™å®šé™åˆ¶çš„情况下明确地寻求解决方法,而ä¸ä»…仅是è¦æ±‚直接替æ¢ã€‚)
æµç¨‹æ›¿æ¢æœ‰å‡ 个方é¢å¿…须解决:
对于我的特殊情况,有一些约æŸæ¡ä»¶ï¼š
malloc
调用,å¥æŸ„,线程æ“作或进程æ“作以跟踪并释放所有这些æ“ä½œï¼Œå› ä¸ºDLLé‡å†™å¹¶ä¸å®Œå…¨å¯è¡Œã€‚call
å’Œpush
都是ä¸åˆ‡å®žé™…çš„ï¼Œå¹¶ä¸”ç”±äºŽæ˜Žæ˜¾çš„åŽŸå› ï¼Œè¿™å°†æ˜¯ç¼“æ…¢çš„ã€‚æ‰€ä»¥ï¼Œè¿™å°±æ˜¯æˆ‘åœ¨æƒ³çš„ä¸»æ—¨ï¼šä½¿ç”¨ç±»ä¼¼äºŽå‡è¹¦åºŠçš„东西。
MAX_PATH + 1
表示应用程åºè·¯å¾„çš„å—符+ '\0'
。MAX_PATH + 1
表示当å‰å·¥ä½œç›®å½•è·¯å¾„+ '\0'
çš„å—符。'\0'
çš„32768个å—符。'\0'
。这里的想法是使用基于过程的蹦床,并在å¯åŠ¨æ–°åˆ›å»ºçš„蹦床时将当å‰è¿‡ç¨‹çš„大å°é™è‡³ç»å¯¹æœ€å°ã€‚
但是在我ä¸å¤ªç†Ÿæ‚‰Windows的地方,我å¯èƒ½åœ¨è¿™é‡ŒçŠ¯äº†å¾ˆå¤šé”™è¯¯ã€‚å¦å¤–,上述内容似乎æžå…¶æ•ˆçŽ‡ä½Žä¸‹ï¼Œå¹¶ä¸”在æŸç§ç¨‹åº¦ä¸Šæ¥è¯´ï¼Œè¿™å¯¹äºŽå†…æ ¸å¯ä»¥é‡Šæ”¾ä¸€äº›å†…å˜é¡µé¢ï¼Œå–消分é…ä¸€å †å†…å˜å¥æŸ„并为下一个内å˜åˆ†é…一些内å˜è€Œæ„Ÿåˆ°éžå¸¸é”™è¯¯ã€‚过程。
å› æ¤ï¼Œæ€»è€Œè¨€ä¹‹ï¼Œåœ¨é™åˆ¶æœ€å°‘çš„Windows上模拟进程替æ¢çš„ç†æƒ³æ–¹æ³•æ˜¯ä»€ä¹ˆï¼Ÿ
ç”案 0 :(得分:0)
Windows有execve()
和朋å‹ï¼Œè¯·å‚阅:
https://docs.microsoft.com/en-gb/cpp/c-runtime-library/reference/execve-wexecve
æ®æˆ‘所知(除了Windows没有信å·çš„事实),这些信å·ä¸ŽPOSIX版本具有相åŒçš„è¯ä¹‰ï¼Œæ‰€ä»¥æ‚¨ä¸ºä»€ä¹ˆè¿˜è¦å¯»æ‰¾å…¶ä»–东西?
-或-
(å¯èƒ½æ›´å¥½ï¼Œå› 为它å¯ä»¥è®©æ‚¨æ›´å¥½åœ°æŽ§åˆ¶å½“å‰è¿›ç¨‹ä¸æ‰“开的å¥æŸ„是å¦åº”ç”±æ£åœ¨ç”Ÿæˆçš„进程继承):
CreateProcess (...);
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æµä¸Žå…¶è®¤ä¸ºæ˜¯å•èŠ‚点应用程åºçš„通信。