2015-05-15 7 views
9

मुझे Process.Kill() का उपयोग करने में समस्या हो रही है। मुझे लगता है कि मुझे गलतफहमी होना चाहिए कि यह कैसे काम करता है। यह मेरा परीक्षण समारोह है। मैं एक लंबी चल रही प्रक्रिया शुरू करता हूं (ping -t) और फिर इसे पांच सेकंड बाद मार दें।प्रक्रिया। किल() प्रक्रिया को मारने लगती नहीं है

मैं पिंग प्रक्रिया को दिखा सकता हूं, लेकिन मेरे प्रोग्राम खत्म होने के बाद भी प्रक्रिया अभी भी है। मुझे इसे मैन्युअल रूप से मारना है।

Console.WriteLine("Total number of ping processes is {0}", Process.GetProcessesByName("ping").Length); 

ProcessStartInfo startInfo = new ProcessStartInfo("cmd.exe"); 
Process process = new Process(); 

startInfo.CreateNoWindow = true; 
startInfo.UseShellExecute = false; 
startInfo.Arguments = "/c ping -t 8.8.8.8"; 

Console.WriteLine("Staring ping process"); 
process.StartInfo = startInfo; 
process.Start(); 
Thread.Sleep(5000); 

Console.WriteLine("Total number of ping processes is {0}", Process.GetProcessesByName("ping").Length); 
Thread.Sleep(5000); 

Console.WriteLine("Killing ping process"); 
process.Kill(); 
Thread.Sleep(5000); 

Console.WriteLine("Total number of ping processes is {0}", Process.GetProcessesByName("ping").Length); 

मैं यहां क्या गलत कर रहा हूं?

+0

अपना कोड परीक्षण किया और यह ठीक काम करता है। आप इस कोड को कहां से चला रहे हैं? – vesan

+0

@vesan विंडोज 8.1। PowerShell और cmd.exe दोनों से इसे चलाएं। –

+0

cmd के बिना सीधे Ping.exe निष्पादित करने के लिए कोई अंतर? –

उत्तर

9

आपने cmd.exe शुरू किया, तो cmd.exe बाल प्रक्रिया ping.exe शुरू करता है। Ping.exe को मारने के लिए आप सभी प्रक्रिया पदानुक्रम को मार सकते हैं। WMI के साथ उदाहरण के लिए (System.Management संदर्भ जोड़ने):

private static void KillProcessAndChildrens(int pid) 
{ 
    ManagementObjectSearcher processSearcher = new ManagementObjectSearcher 
     ("Select * From Win32_Process Where ParentProcessID=" + pid); 
    ManagementObjectCollection processCollection = processSearcher.Get(); 

    try 
    { 
     Process proc = Process.GetProcessById(pid); 
     if (!proc.HasExited) proc.Kill(); 
    } 
    catch (ArgumentException) 
    { 
     // Process already exited. 
    } 

    if (processCollection != null) 
    { 
     foreach (ManagementObject mo in processCollection) 
     { 
      KillProcessAndChildrens(Convert.ToInt32(mo["ProcessID"])); //kill child processes(also kills childrens of childrens etc.) 
     } 
    } 
} 
+1

क्या होगा यदि बच्चे की प्रक्रिया स्वयं की प्रक्रिया को जन्म देती है? हमें पूरे पेड़ को दोबारा मारने के लिए कुछ रास्ता चाहिए, नहीं? –

+0

कोड के इस नमूने में हम पूरे पेड़ को दोबारा मार देते हैं। – SulNR

+0

ओह अजीब, मैंने याद किया होगा कि जब मैंने इसे पहले पढ़ा था। मैं आपको बक्षीस दूंगा। –

-1

प्रक्रिया को मारने के लिए आपको एक प्रशासनिक खाते के तहत चलाना होगा। इसका मतलब है कि आप एक 'सत्य' व्यवस्थापक हैं या आप उपयोगकर्ता खाता नियंत्रण (यूएसी) बंद कर दिया है।

अन्यथा प्रक्रिया। किल() विफल हो जाएगी।

here से।

+0

मैं घर आने पर यह कोशिश करूंगा, लेकिन मुझे पूरा यकीन है कि मैंने पहले ही कोशिश की है और यह काम नहीं कर रहा है। यह cmd.exe को व्यवस्थापक के रूप में चलाने के लिए पर्याप्त होना चाहिए और फिर मेरे प्रोग्राम को कॉल करना चाहिए, है ना? –

+0

मैंने अपने टेस्ट प्रोग्राम को व्यवस्थापक प्रॉम्प्ट में चलाने का प्रयास किया है, और यह अभी भी प्रक्रिया को मारने के लिए प्रतीत नहीं होता है। –

0

प्रक्रिया। किल() काम कर रहा है, बस आपको लगता है कि प्रक्रिया पर नहीं। आप जो कर रहे हैं वह वास्तव में 2 प्रक्रियाएं शुरू कर रहा है और केवल पहली प्रक्रिया को मार रहा है, जबकि दूसरी प्रक्रिया चल रही है। आपके पास जो कोड है वह एक नया कमांड खोल शुरू कर रहा है और उस प्रक्रिया की जानकारी को process पर सहेज रहा है। जब आप process.Kill() फोन केवल आदेश खोल से बाहर निकल रहा है आप

Console.WriteLine(process.ProcessName); 

चला सकते हैं इससे पहले कि आप process.Kill() को देखने के लिए जो प्रक्रिया वास्तव में मारे जाने के लिए जा रहा है। कमांड खोल के तर्क के रूप में \c ping -t 8.8.8.8 को सेट करके, आप कमांड खोल को दूसरी प्रक्रिया शुरू करने के लिए कह रहे हैं (इस मामले में पिंग) और इसे स्वयं से अलग करें। आपके कार्यक्रम को बच्चे की प्रक्रिया के बारे में कोई जानकारी नहीं है और इसे मार नहीं पाएगा।

Console.WriteLine("Total number of ping processes is {0}", Process.GetProcessesByName("ping").Length); 

ProcessStartInfo startInfo = new ProcessStartInfo("ping"); 
Process process = new Process(); 

startInfo.CreateNoWindow = true; 
startInfo.UseShellExecute = false; 
startInfo.Arguments = "-t 8.8.8.8"; 

Console.WriteLine("Staring ping process"); 
process.StartInfo = startInfo; 
process.Start(); 
Thread.Sleep(5000); 

Console.WriteLine("Total number of ping processes is {0}", Process.GetProcessesByName("ping").Length); 
Thread.Sleep(5000); 

Console.WriteLine("Killing ping process"); 
process.Kill(); 
Thread.Sleep(5000); 

Console.WriteLine("Total number of ping processes is {0}", Process.GetProcessesByName("ping").Length); 

अगर, हालांकि, अगर तुम सच में पहले आदेश खोल शुरू करने की आवश्यकता आप बच्चे प्रक्रियाओं खोजने के लिए और तर्क की आवश्यकता होगी: तुम सब वास्तव में चाहते हैं पिंग प्रक्रिया को मारने के लिए है, तो आप करने के लिए अपने कोड को बदल सकते हैं उसे मारने के लिए। की तरह कुछ:

foreach(var p in Process.GetProcessesByName("ping")) 
{ 
    p.Kill(); 
} 

[संपादित करें] * क्षमा करें, मैं पहली बार में @Adriano REPETTI से टिप्पणी नहीं देखा। मैं अनावश्यक होने का मतलब नहीं था।

0

यह बच्चा प्रक्रियाओं के अपने जवाब रिसाव बच्चे प्रक्रियाओं के बाद से @SulNR जवाब के लिए एक पैच है।

private static void KillProcessAndChildrens(int pid) 
{ 
    ManagementObjectSearcher processSearcher = new ManagementObjectSearcher 
     ("Select * From Win32_Process Where ParentProcessID=" + pid); 
    ManagementObjectCollection processCollection = processSearcher.Get(); 

    // We must kill child processes first! 
    if (processCollection != null) 
    { 
     foreach (ManagementObject mo in processCollection) 
     { 
      KillProcessAndChildrens(Convert.ToInt32(mo["ProcessID"])); //kill child processes(also kills childrens of childrens etc.) 
     } 
    } 

    // Then kill parents. 
    try 
    { 
     Process proc = Process.GetProcessById(pid); 
     if (!proc.HasExited) proc.Kill(); 
    } 
    catch (ArgumentException) 
    { 
     // Process already exited. 
    } 
} 
संबंधित मुद्दे