0

我有一个生成 Win32 进程的 Java 应用程序: Runtime.getRuntime().exec(cmdarray);

Win32 进程还将使用 CreateProcess win32 API 生成各种子子进程。当Java代码杀死win32进程时:p.destroy()

win32 进程被破坏,但孩子们还活着!由于 p.destroy 似乎调用了 TerminateProcess Win32 API,我不能在我的 Win32 启动器中触发处理程序来杀死孩子。

我尝试使用 DEBUG_PROCESS 选项启动 subChildren,也尝试使用 DebugActiveProcess 但没有取得多大成功... DebugActiveProcess 返回 50 作为 GetLastError (不允许操作)。

有什么建议么 ?

4

2 回答 2

0

使用此代码(为了清楚起见,我省略了 try/catch)。然后循环遍历进程列表并找到要杀死的子进程。然后,您可以按名称或 pid 杀死。每行以逗号分隔。

final List<String> processList = new ArrayList<String>();
String line = null;
final ProcessBuilder pb = new ProcessBuilder("tasklist", "/fo", "csv");
pb.redirectErrorStream(true);
BufferedReader in = null;

final Process p = pb.start();
in = new BufferedReader(new InputStreamReader(p.getInputStream(), "UTF-8"));
while ((line = in.readLine()) != null) {
    processList.add(line);
}

使用 split(",") 就行了。索引 0 是进程名称,索引 1 是 pid。

杀死它:

final ProcessBuilder pb = new ProcessBuilder("taskkill", "/PID", pid, "/f");
于 2013-11-05T18:48:07.713 回答
0

Process.destroy()不给目标进程清理的机会(特别是清理它们的子进程)。在不了解启动过程的情况下,很难提供进一步的指导。

如果您可以控制子进程的来源,那么最好的选择是添加某种 IPC,以便您可以明确地告诉它们何时关闭(例如,全局事件)。

如果您无法控制子进程的来源,那么您的最佳选择需要一点 win32 编程。

您想要做的是遍历顶级 HWND以查找您启动的进程所拥有的 HWND,当您找到它们时,将带有 SC_CLOSE 的WM_SYSCOMMAND消息发布到该 HWND。这适用于 Windows 应用程序和控制台应用程序。

于 2013-11-05T18:08:33.447 回答