2012-05-17 21 views
9

के लिए Process.destroy() स्रोत कोड मुझे यह देखने के लिए Process.destroy() पर कोड की जांच करने की आवश्यकता है कि यह वास्तव में kill लिनक्स पर एक उपप्रोसेस है।जावा - Linux

क्या किसी को पता है कि यह विधि क्या करती है या उसके स्रोत का लिंक है? मैंने jdk स्रोत की जांच की और Process केवल एक सार वर्ग है और destroy विधि लागू नहीं की गई है, extends या implementsProcess किसी भी उपclass के लिए कोई लिंक नहीं प्रतीत होता है। किसी भी तरह की सहायता को आभार समझेंगे।

धन्यवाद,

+2

यह लगभग निश्चित रूप से 'मार (पिड, सिगरम)' कहता है। आपको क्यों लगता है कि आपको जानने की जरूरत है? – EJP

उत्तर

13

प्रक्रिया प्रबंधन और सभी तरह के आपरेशनों ओएस द्वारा किया जाता है। इसलिए, प्रक्रिया को नष्ट करने के लिए JVM को उचित सिस्टम कॉल को कॉल करना होगा। जाहिर है, ऑपरेटिंग सिस्टम के बीच अलग-अलग होगा।

लिनक्स पर, हमारे पास kill सिस्कोल ऐसा करने के लिए है - या exit यदि हम वर्तमान में चल रहे प्रक्रिया को समाप्त करना चाहते हैं। जेडीके स्रोतों में देशी विधियां निश्चित रूप से ऑपरेटिंग सिस्टम के अनुसार अलग होती हैं, जेवीएम चलने जा रहा है। जैसा कि पहले उल्लेख किया गया है, Process में public void destroy() विधि है। लिनक्स के मामले में, इस विधि को UNIXProcess द्वारा कार्यान्वित किया गया है। destroy() विधि इस तरह काफी कार्यान्वित किया जाता है:

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

देशी विधि destroyProcess(), बारी में, UNIXProcess_md.c में परिभाषित किया गया है और इस तरह दिखता है:

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

कहाँ kill लिनक्स syscall, जिसका स्रोत है लिनक्स कर्नेल में उपलब्ध है, फाइल kernel/signal.c में अधिक सटीक रूप से। इसे SYSCALL_DEFINE2(kill, pid_t, pid, int, sig) के रूप में घोषित किया गया है।

हैप्पी रीडिंग! :)

+1

कम से कम ओपनजेडीके 7 में सावधान रहें, 'नष्ट' विधि 'विनाश' प्रक्रिया को कॉल करने के बाद stdin, stdout और stderr को बंद कर देगी। – Lekensteyn