2012-11-07 11 views
7

मेरे पास निम्न कोड है जो एक बाल कांटा बनाते हैं। और मैं माता-पिता में अपना निष्पादन पूरा करने से पहले बच्चे को मारना चाहता हूं। इसे कैसे करना है?कांटा के बच्चे को कैसे मारना है?

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 

int i; 

main (int ac, char **av) 
{ 
    int pid; 

    i = 1; 

    if ((pid = fork()) == 0) { 
    /* child */ 
    while (1) { 
     printf ("I m child\n"); 
     sleep (1); 
    } 
    } 
    else { 
    /* Error */ 
    perror ("fork"); 
    exit (1); 
    } 
    sleep (10) 

    // TODO here: how to add code to kill child?? 

} 
+3

'कांटा()' रिटर्न एक 'pid_t' , 'int' नहीं, इसलिए आपको अपना वैरिएबल घोषित करना चाहिए। –

+1

मूल प्रश्न से संबंधित नहीं: जब कांटा एक नई प्रक्रिया को वापस लाता है (सफलता के मामले में) और माता-पिता और बच्चे दोनों उस बिंदु से निष्पादन जारी रखते हैं जहां 'कांटा' कहा जाता है। एक बच्चे की प्रक्रिया के लिए pid = 0 (अच्छी तरह से, यह हमेशा माता-पिता प्रक्रिया के लिए getpid()) और pid> 0 के माध्यम से प्राप्त कर सकता है। त्रुटि तब होती है जब कांटा रिटर्न -1। आपके कोड में आप एक "पैरेंट प्रोसेस" भाग को एक त्रुटि के रूप में देख रहे हैं। –

+0

संभावित डुप्लिकेट [माता-पिता प्रक्रिया द्वारा बाल प्रक्रिया को कैसे मारें?] (Http://stackoverflow.com/questions/6501522/how-to-kill-a-child-process-by-the-parent-process) – goozez

उत्तर

8

एक संकेत भेजें।

#include <sys/types.h> 
#include <signal.h> 

kill(pid, SIGKILL); 

/* or */ 

kill(pid, SIGTERM); 

दूसरा फॉर्म अन्य के बीच बेहतर है, यदि आप स्वयं द्वारा सिग्नल संभाल लेंगे।

+5

या 'सिगरम', यदि आप अधिक विनम्र होना चाहते हैं :) –

+2

हर कोई सिगकिल्स पर जोर क्यों देता है? –

+0

@ निकलास बी .: क्या यहां 'सिगरम' का उपयोग करने का कोई फायदा है? जहां तक ​​मैं देख सकता हूं, उसके पास कोई हैंडलर नहीं है। – md5

3

अंक kill(pid, SIGKILL) माता-पिता से बाहर।

9

kill सिस्टम कॉल देखें। आमतौर पर SIGTERM का उपयोग करने से पहले प्रक्रिया को देने के लिए SIGTERM का उपयोग करने का एक अच्छा विचार है।

संपादित

आप waitpid उपयोग करने के लिए है कि इस प्रक्रिया की वापसी का दर्जा मिल और ज़ोंबी प्रक्रियाओं को रोकने के लिए की जरूरत है भूल।

एक और संपादित करें

आप नीचे दिए गए कोड का उपयोग कर सकते हैं:

kill(pid, SIGTERM); 

bool died = false; 
for (int loop; !died && loop < 5 /*For example */; ++loop) 
{ 
    int status; 
    pid_t id; 
    sleep(1); 
    if (waitpid(pid, &status, WNOHANG) == pid) died = true; 
} 

if (!died) kill(pid, SIGKILL); 

यह प्रक्रिया 5 सेकंड दे देंगे मरने के लिए शान से

संबंधित मुद्दे