2012-05-17 21 views
9

Muszę sprawdzić kod Process.destroy(), aby zobaczyć, jak dokładnie to jest kill s podproces w systemie Linux.Kod źródłowy Java - Process.destroy() dla Linuksa

Czy ktoś wie, co ta metoda ma lub ma link do źródła? Sprawdziłem źródło jdk i Process to tylko klasa abstrakcyjna, a metoda destroy nie została zaimplementowana, wydaje się, że nie ma żadnych odnośników do żadnej podklasy, która jest extends lub implementsProcess. Każda pomoc zostanie doceniona.

Dzięki,

+2

Prawie na pewno nazywa się "kill (pid, SIGTERM)". Jak myślisz, dlaczego powinieneś wiedzieć? – EJP

Odpowiedz

13

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! :)

+1

Uwaga, przynajmniej OpenJDK 7, metoda 'destroy' również zamknie stdin, stdout i stderr po wywołaniu' destroyProcess'. – Lekensteyn