waitpid : why does this not work?

Thomas Hoffmann <[email protected]> Mon, 15 Sep 2003 21:50:26 +0200
Newsgroups gmane.comp.ide.emx.devel
Organization private site
Message-ID <[email protected]>
I did not find too many discussion about waitpid() on older OS/2+emx 
archives, so I will ask this here:

According to some sample code e.g. in the glibc documentation something 
like this should collect all the children of a process in a signal 
handler for SIGCLD/SIGCHLD:

static RETSIGTYPE
chldHndl(int foo)
{
    pid_t pid;
    int status;
    int save_errno = errno;
    sigset_t sigs;

    static int dct=0;

    sigfillset(&sigs);

    /* Block signals so that NotifyDeadProcess() doesn't get fux0red */
    sigprocmask(SIG_BLOCK, &sigs, NULL);

    /* If 2 or more kids exit in a small time window, before this 
handler gets
     * the chance to get invoked, the SIGCHLD signals will be merged and 
only
     * one SIGCHLD signal will be sent to us. We use a while loop to get all
     * exited child status because we can't count on the number of SIGCHLD
     * signals to know exactly how many kids have exited. -Dan
     */
    while ((pid=waitpid(-1, &status, WNOHANG))>0 || (pid<0 && 
errno==EINTR)) {
      printf("bury dbg 4a: %i - %i -%i\n"),dct++,pid,status);
      NotifyDeadProcess(pid, WEXITSTATUS(status));
      printf("bury dbg 4b: %i - %i -%i\n"),dct++,pid,status);
    }
    WDelayedActionSet++;
   
    sigprocmask(SIG_UNBLOCK, &sigs, NULL);

    errno = save_errno;   
}

But it does not work at all for me: an infinite loop starts as soon as 
this handler is entered. The log file reads (messages starting w/ 
"warning" come from NotifyDeadprocess()):

bury dbg 4a: 0 - 153 -0
warning: debug stack:dead process (pid=153)
bury dbg 4b: 1 - 153 -0
bury dbg 4a: 2 - 153 -0
warning: debug stack:dead process duplicate id (pid=153)
bury dbg 4b: 3 - 153 -0
bury dbg 4a: 4 - 153 -0
warning: debug stack:dead process duplicate id (pid=153)
bury dbg 4b: 5 - 153 -0
bury dbg 4a: 6 - 153 -0
warning: debug stack:dead process duplicate id (pid=153)
bury dbg 4b: 7 - 153 -0
bury dbg 4a: 8 - 153 -0
warning: debug stack:dead process duplicate id (pid=153)
bury dbg 4b: 9 - 153 -0
bury dbg 4a: 10 - 153 -0
warning: debug stack:dead process duplicate id (pid=153)
bury dbg 4b: 11 - 153 -0
.....

I can not make any sense of this return with a valid pid and a status of 
0: can anybody of you?

Thomas.

-- 
Thomas Hoffmann                                    
[email protected]                                       Dresden, Germany

..sig under construction ...