Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 16 Nov 1999 05:30:02 -0800 (PST)
From:      "Jonathan M. Bresler" <jmb@hub.freebsd.org>
To:        freebsd-bugs@FreeBSD.org
Subject:   i386/14689: waitpid doesn't harvest child process when
Message-ID:  <199911161330.FAA20808@freefall.freebsd.org>

next in thread | raw e-mail | index | archive | help
The following reply was made to PR i386/14689; it has been noted by GNATS.

From: "Jonathan M. Bresler" <jmb@hub.freebsd.org>
To: freebsd-gnats-submit@freebsd.org
Cc: wpk@isc.org
Subject: i386/14689: waitpid doesn't harvest child process when
Date: Tue, 16 Nov 1999 05:23:58 -0800 (PST)

 program run under cron
 
 
 Bill, 
 	Thanks for the code snippet.  I am going to add the code and
 the results of running it to the bug tracking system.
 
 jmb
 
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 run from an xterm:
 
 baby:[215] ./x
 child 26962, deadpid 26962, errno 0, T_int 0
 deadpid == child
 
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 run from cron
 
 child 26951, deadpid -1, errno 4, T_int 14
 terminating child
 child 26951, deadpid 26951, errno 3, T_int 0
 deadpid == child
 
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 Example Code:
 
 #include    <ctype.h>
 #include    <errno.h>
 #include    <limits.h>
 #include    <stdarg.h>
 #include    <stdio.h>
 #include    <stdlib.h>
 #include    <string.h>
 #include    <sys/wait.h>
 #include    <signal.h>
 #include    <time.h>
 #include    <unistd.h>
 #include    <pthread.h>
 
 
 #define T_TIMEOUT   60
 
 static int  T_timeout;
 static int  T_int;
 
 static void t_sighandler();
 
 static void
 t_sighandler(int sig) {
     T_int = sig;
 }
 
 int
 main(int argc, char **argv)
 {
 
     pid_t           child;
     pid_t           deadpid;
     int         status;
     struct sigaction    sa;
 
     T_timeout = T_TIMEOUT;
 
     /* setup signals */
 
     sa.sa_flags = 0;
     sigfillset(&sa.sa_mask);
     sa.sa_handler = t_sighandler;
     (void) sigaction(SIGALRM, &sa, NULL);
     (void) sigaction(SIGINT,  &sa, NULL);
 
     setbuf(stdout, NULL);
 
     child = fork();
     if (child == 0) {
         sleep(10);
         exit(0);
     }
     else if (child > 0) {
 
         T_int = 0;
         sa.sa_handler = t_sighandler;
         (void) sigaction(SIGALRM, &sa, NULL);
         alarm(T_timeout);
 
         deadpid = (pid_t) -1;
         while (deadpid != child) {
             deadpid = waitpid(child, &status, 0);
 	printf("child %d, deadpid %d, errno %d, T_int %d\n", 
 		child, deadpid, errno, T_int);
             if (deadpid == child) {
                 printf("deadpid == child\n");
                 if (WIFSIGNALED(status)) {
                     if (WTERMSIG(status) == SIGTERM)
                         printf("the test case timed out\n");
                     else
                         printf("the test case caused exception %d\n",
 				WTERMSIG(status));
                 }
             }
             else if ((deadpid == -1) && (errno == EINTR) && T_int) {
                 printf("terminating child\n");
                 kill(child, SIGTERM);
                 T_int = 0;
             }
             else if ((deadpid == -1) &&
                  ((errno == ECHILD) || (errno == ESRCH))) {
                 printf("no such process\n");
                 break;
             }
         }
 
         sa.sa_handler = SIG_IGN;
         (void) sigaction(SIGALRM, &sa, NULL);
         alarm(0);
     }
     else {
         printf("fork failed, errno == %d\n", errno);
     }
 
     return(0);
 }
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 


To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-bugs" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199911161330.FAA20808>