我想用Unix exec这个新的替换当前的Java进程。这里已经有了一个similar question,但我更喜欢一个尽可能少使用内存的解决方案(accepted answer建议使用ClassLoader
,这可能导致内存泄漏;一个类似的简单解决方案就是使用另一个进程来启动正确的)。它肯定可以使用JNI以一种依赖于平台的方式完成,我认为我可以在Unix上完成它(而Unix的solution似乎已经存在),但我几乎对相应的Windows API几乎一无所知。我应该拨打哪些Windows功能?有没有人已经做到了?如何使用JNA/JNI替换Windows中的当前Java进程?
回答
在Windows中,有很多子系统可以选择在基本操作系统上运行,因此它有助于了解您的目标。例如,如果你可以使用C运行时库,那么你可以使用_exec()
系列的函数,它们和unix兄弟很相似。也许你可以使用这些修改jniexec来使用windows。
你写过“如果你可以使用C运行库” - 我应该怎么知道?如果我想在您的计算机上运行我的应用程序(运行Windows XP,Vista或7;我不在乎旧版或异形版),该怎么办? AFAIK,用JNI我需要打包一个包含调用'_exec'的小DLL,还有更多? – maaartinus 2011-03-27 16:33:31
我不是所有可以获得C运行时库的专家。当然,一种方法是使用Visual Studio来构建库。 [Wikipedia](https://secure.wikimedia.org/wikipedia/en/wiki/Microsoft_Windows_library_files#Msvcrt.dll)在这个主题上有一些话。 – 2011-03-27 17:22:47
Windows中_exec()的行为与POSIX API的行为非常不同。最值得注意的是,它不会重用相同的PID,所以父进程会认为子进程已经终止。 – 2011-05-22 23:23:51
Win32 API不包含'exec'的概念。 POSIX API的确如此。低级别的WinNT API具有构建块,但使用它们相当复杂,并且至少在过去,需要求助于未公开的功能。
- 1. 如何替换当前的Java进程,就像unix风格的exec?
- 2. 如何替换当前的CALayer
- 3. 如何获取Windows中当前进程的所有子进程的句柄?
- 4. 如何在Perl的system()中使用shell的进程替换?
- 5. 如何使用javascript替换当前文档URL的文本
- 6. 当前版本的msysgit是否支持进程替换?
- 7. 如何确定当前进程中COM使用的内部HWND?
- 8. 如何用过渡替换Silverlight/WP7中的当前控件?
- 9. 替换当前Windows用户与其他用户运行EXE
- 10. 如何从Windows Powershell调用Java进程?
- 11. 如何在Erlang shell中获取当前进程的进程ID?
- 12. 在Windows中,如何用`new`替换`GlobalAlloc`?
- 13. 如何用旧的替换当前的svn版本的分支?
- 14. 如何在Java中替换“./”?
- 15. 如何在java中打开文件之前等待windows进程完成之前
- 16. 如何使库在java中可替换?
- 17. 是否可以在String.replaceAll中使用当前替换的数量?
- 18. 如何用当前单词替换过去的单词
- 19. 如何用svn的版本库替换当前版本?
- 20. 如何在java中使用windows API获取当前的鼠标光标类型?
- 21. JSON.stringify() - 如何知道替换器中的当前深度
- 22. 如何替换html textarea中当前选定的文本?
- 23. windows api:如何在当前进程中找到活动线程数?
- 24. 如何用'\'替换'/'使用QString替换()?
- 25. 如何使Visual Studio将默认值替换为当前选择?
- 26. 如何使用Java中断Linux进程
- 27. 如何在java中用“\\”替换“\\”
- 28. PHP:exec() - 替换进程
- 29. 如何在GenServer中执行对当前进程的调用?
- 30. 如何从Windows服务启动进程到当前登录的用户会话
您是否正在启动另一个JVM进程?如果是这样,你担心什么内存效率低下? – 2011-03-27 15:46:39
使用Unix exec解决所有问题;关于内存消耗的评论涉及纯Java解决方案。 – maaartinus 2011-03-27 15:56:55