2012-05-17 26 views
9

Linux'taki bir alt işlemin tam olarak nasıl olduğunu görmek için Process.destroy() kodunu kontrol etmem gerekiyor.Java - Process.destroy() kaynak kodu Linux için

Bu yöntemin ne yaptığını veya kaynağıyla ilgili bir bağlantısı olduğunu bilen var mı? jdk kaynağını kontrol ettim ve Process sadece soyut bir sınıf ve destroy yöntemi uygulanmadı, herhangi bir alt sınıfın extends veya implementsProcess bağlantı yok gibi görünüyor. Herhangi bir yardım takdir edilecektir.

sayesinde

+2

Neredeyse kesinlikle "kill (pid, SIGTERM)" yi çağırır. Neden bilmen gerektiğini düşünüyorsun? – EJP

cevap

13

Süreç yönetimi ve tüm benzeri işlemler işletim sistemi tarafından yapılmaktadır. Bu nedenle, JVM bir işlemi yok etmek için uygun sistem çağrısını çağırmalıdır. Bu, açıkça, işletim sistemleri arasında değişecektir.

Linux'ta bunu yapmak için kill sistem çağrısı var - veya şu anda çalışan işlemi sonlandırmak istiyorsak exit. JDK kaynaklarındaki yerel yöntemler elbette, JVM'nin çalışacağı işletim sistemine göre ayrılır. Daha önce belirtildiği gibi, Process, bir public void destroy() yöntemine sahiptir. Linux durumunda, bu yöntem UNIXProcess tarafından uygulanır. destroy() yöntem hemen hemen böyle uygulanır:

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

yerli yöntem destroyProcess(), sırayla, UNIXProcess_md.c tanımlanır ve şöyle görünür: kill kaynak Linux sistem çağrısını olduğu

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

Linux çekirdeğinde, daha doğrusu kernel/signal.c numaralı dosyada bulunur. SYSCALL_DEFINE2(kill, pid_t, pid, int, sig) olarak beyan edilmiştir.

Mutlu okuma!

+1

En azından OpenJDK 7'de, 'destroy' yönteminin 'destroyProcess' komutunu çağırdıktan sonra stdin, stdout ve stderr'i de kapatacağına dikkat edin. – Lekensteyn

İlgili konular