Zarządzanie procesami i wszystkie podobne operacje są wykonywane przez system operacyjny. Dlatego JVM musi wywołać odpowiednie wywołanie systemowe, aby zniszczyć proces. Będzie to oczywiście różnić się w zależności od systemu operacyjnego.
W systemie Linux mamy do tego syscall kill
- lub exit
, jeśli chcemy zakończyć aktualnie uruchomiony proces. Natywne metody w źródłach JDK są oczywiście rozdzielone zgodnie z systemem operacyjnym, na którym JVM będzie działać. Jak wspomniano wcześniej, Process
ma metodę public void destroy()
. W przypadku Linuksa ta metoda jest implementowana przez UNIXProcess
. Metoda destroy()
realizowany jest prawie tak:
private static native void destroyProcess(int pid);
public void destroy() {
destroyProcess(pid);
}
Natywna metoda destroyProcess()
z kolei jest zdefiniowana w UNIXProcess_md.c
i wygląda następująco:
JNIEXPORT void JNICALL
Java_java_lang_UNIXProcess_destroyProcess(JNIEnv *env, jobject junk, jint pid)
{
kill(pid, SIGTERM);
}
Gdzie kill
jest syscall Linux, którego źródłem jest dostępny w jądrze Linuksa, dokładniej w pliku kernel/signal.c
. Jest zadeklarowany jako SYSCALL_DEFINE2(kill, pid_t, pid, int, sig)
.
Szczęśliwe czytanie! :)
Prawie na pewno nazywa się "kill (pid, SIGTERM)". Jak myślisz, dlaczego powinieneś wiedzieć? – EJP