2012-05-17 33 views
9

Necesito verificar el código de Process.destroy() para ver exactamente cómo kill es un subproceso en Linux.Java - Código fuente Process.destroy() para Linux

¿Alguien sabe lo que hace este método o tiene un enlace a su origen? Revisé la fuente jdk y Process es solo una clase abstracta y el método destroy no se ha implementado, parece que no hay enlaces a ninguna subclase que extends o implementsProcess. Cualquier ayuda será apreciada.

Gracias,

+2

Casi con seguridad llama 'kill (pid, SIGTERM)'. ¿Por qué crees que necesitas saber? – EJP

Respuesta

13

gestión de procesos y todas las operaciones se llevan a cabo como por el sistema operativo. Por lo tanto, la JVM debe llamar a la llamada del sistema apropiada para destruir un proceso. Esto, obviamente, variará entre los sistemas operativos.

En Linux, tenemos el syscall kill para hacer eso - o exit si queremos terminar el proceso en ejecución. Los métodos nativos en las fuentes JDK están, por supuesto, separados de acuerdo con el sistema operativo en el que se ejecutará la JVM. Como se indicó anteriormente, Process tiene un método public void destroy(). En el caso de Linux, este método está implementado por UNIXProcess. El método destroy() se lleva a cabo más o menos así:

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

El método nativo destroyProcess(), a su vez, se define en UNIXProcess_md.c y se ve así:

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

Dónde kill es la llamada al sistema de Linux, cuya fuente está disponible en el kernel de Linux, más precisamente en el archivo kernel/signal.c. Se declara como SYSCALL_DEFINE2(kill, pid_t, pid, int, sig).

Happy reading! :)

+1

Tenga cuidado, al menos en OpenJDK 7, el método 'destroy' también cerrará stdin, stdout y stderr después de llamar a' destroyProcess'. – Lekensteyn

Cuestiones relacionadas