Версия Clojure:
(defn comb [k l]
(if (= 1 k) (map vector l)
(apply concat
(map-indexed
#(map (fn [x] (conj x %2))
(comb (dec k) (drop (inc %1) l)))
l))))
Без использования чистой Java.
Самая простая альтернатива - использовать Runtime.exec ()
для запуска команды kill -9
в качестве внешнего процесса.
К сожалению, получить PID не так-то просто. Вам нужно будет либо использовать черную магию отражения для доступа к полю private int pid
, либо возиться с выводом команды ps
.
ОБНОВЛЕНИЕ - вообще-то есть другой способ. Создайте небольшую утилиту (программу C, сценарий оболочки, что угодно), которая будет запускать реальное внешнее приложение. Запрограммируйте утилиту так, чтобы она запомнила PID дочернего процесса и настроила обработчик сигнала для SIGTERM, который будет SIGKILL дочернему процессу.
Стивен, его ответ правильный. Я написал то, что он сказал:
public static int getUnixPID(Process process) throws Exception
{
System.out.println(process.getClass().getName());
if (process.getClass().getName().equals("java.lang.UNIXProcess"))
{
Class cl = process.getClass();
Field field = cl.getDeclaredField("pid");
field.setAccessible(true);
Object pidObject = field.get(process);
return (Integer) pidObject;
} else
{
throw new IllegalArgumentException("Needs to be a UNIXProcess");
}
}
public static int killUnixProcess(Process process) throws Exception
{
int pid = getUnixPID(process);
return Runtime.getRuntime().exec("kill " + pid).waitFor();
}
Вы также можете получить pid таким образом:
public static int getPID() {
String tmp = java.lang.management.ManagementFactory.getRuntimeMXBean().getName();
tmp = tmp.split("@")[0];
return Integer.valueOf(tmp);
}