Java产生一个Windows进程,它自己生成各种子进程

时间:2013-11-05 17:21:54

标签: java windows winapi

我有一个生成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(操作未被授权)。

有什么建议吗?

2 个答案:

答案 0 :(得分:0)

Process.destroy()没有给目标进程一个清理的机会(特别是清理他们的孩子)。如果不了解所开始的流程,就很难给出进一步的指导。

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

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

您要做的是iterate over the top-level HWNDs查找您启动的流程所拥有的HWND,当您找到它们时,将带有SC_CLOSE的WM_SYSCOMMAND消息发布到该HWND。这适用于Windows应用和控制台应用。

答案 1 :(得分: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");
相关问题