2011-08-23 5 views
9

का उदाहरण मुझे waitpid, WNOHANG और SIGCHLD सी में संयुक्त उदाहरण की आवश्यकता है, और मैं उन सभी को \ पृष्ठभूमि के साथ कैसे उपयोग कर सकता हूं?प्रतीक्षापिड, WNOHANG, और SIGCHLD

signal(SIGCHLD, SIG_IGN); 

waitpid(child, status, 0); 
+6

लिया और मैं तुम्हें, वह भी साथ एक 'ए' करना चाहते हैं सही अनुमान लगा रहा हूँ? :-) – Jason

उत्तर

10

से http://voyager.deanza.edu/~perry/sigchld.html

#include <stdio.h> /************ Handling SIGCHLD!! ******************/ 
#include <signal.h> 
#include <unistd.h> 
#include <stdlib.h> 
#include <sys/wait.h> /***** For waitpid.     *****/ 
#include <setjmp.h> /***** For sigsetjmp and siglongjmp. *****/ 

sigjmp_buf env; 
main() 
{ 
    pid_t pid; 
    int n = 20; 
    struct sigaction sa; 
    void delete_zombies(void); 

    sigfillset(&sa.sa_mask); 
    sa.sa_handler = delete_zombies; 
    sa.sa_flags = 0; 
    sigaction(SIGCHLD, &sa, NULL); 

    sigsetjmp(env, 1); 
    if ((pid = fork()) < 0) 
    { 
     perror("Bad fork!"); 
     exit(1); 
    } 

    if (pid > 0) /***** Parent *****/ 
    { 
     printf("Created child %ld\n", pid); 
     sleep(n -= 2); 
     kill(0, SIGKILL); 
    } 
    else   /***** Child *****/ 
    { 
     sleep(2); 
     exit(0); /****** Not necessary here but... ******/ 
    } 
} 




void delete_zombies(void) 
{ 
    pid_t kidpid; 
    int status; 

    printf("Inside zombie deleter: "); 
    while ((kidpid = waitpid(-1, &status, WNOHANG)) > 0) 
    { 
     printf("Child %ld terminated\n", kidpid); 
    } 
    siglongjmp(env,1); 
} 
संबंधित मुद्दे