2012-05-17 5 views
9

Ich muss auf Code von Process.destroy() überprüfen, um zu sehen, wie genau es kill s ein Unterprozess unter Linux ist.Java - Process.destroy() Quellcode für Linux

Weiß jemand, was diese Methode tut oder einen Link zu ihrer Quelle hat? Ich überprüfte die jdk Quelle und Process ist nur eine abstrakte Klasse und die destroy Methode wurde nicht implementiert, scheint es keine Links zu keiner Unterklasse, die extends oder implementsProcess. Jede Hilfe wird geschätzt.

Danke,

+2

Es ruft fast sicher 'kill (pid, SIGTERM)'. Warum denkst du, du musst es wissen? – EJP

Antwort

13

Prozessmanagement und alle ähnlichen Operationen werden von den OS getan. Daher muss die JVM den entsprechenden Systemaufruf aufrufen, um einen Prozess zu zerstören. Dies wird natürlich zwischen den Betriebssystemen variieren.

Unter Linux haben wir die kill syscall das zu tun - oder 10, wenn wir den laufenden Prozess beenden möchten. Die nativen Methoden in den JDK-Quellen sind natürlich nach dem Betriebssystem getrennt, auf dem die JVM ausgeführt wird. Wie zuvor erwähnt, hat Process ein public void destroy()-Verfahren. Im Fall von Linux wird diese Methode von UNIXProcess implementiert. Die destroy() Methode ist ziemlich ähnlich wie dies umgesetzt:

private static native void destroyProcess(int pid); 
public void destroy() { 
    destroyProcess(pid); 
} 

Die native Methode destroyProcess(), die wiederum in UNIXProcess_md.c definiert ist, und sieht wie folgt aus:

JNIEXPORT void JNICALL 
Java_java_lang_UNIXProcess_destroyProcess(JNIEnv *env, jobject junk, jint pid) 
{ 
    kill(pid, SIGTERM); 
} 

Wo kill die Linux syscall ist, dessen Quelle ist im Linux-Kernel verfügbar, genauer gesagt in der Datei kernel/signal.c. Es wird als SYSCALL_DEFINE2(kill, pid_t, pid, int, sig) deklariert.

Viel Spaß beim Lesen! :)

+1

Vorsicht, zumindest in OpenJDK 7 wird die 'destroy' Methode auch stdin, stdout und stderr nach Aufruf von' destroyProcess' schließen. – Lekensteyn