1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96
|
/*
** Copyright 1998 - 1999 Double Precision, Inc.
** See COPYING for distribution information.
*/
#ifndef INCLUDED_FROM_CONFIGURE
#include "waitlib.h"
#endif
#include <signal.h>
static const char rcsid[]="$Id: waitlib.c,v 1.3 1999/12/06 13:32:02 mrsam Exp $";
#if HAVE_SIGHOLD
#define HOLD_CHILDREN sighold(SIGCHLD)
#define RELEASE_CHILDREN sigrelse(SIGCHLD)
#else
#define HOLD_CHILDREN sigblock(sigmask(SIGCHLD))
#define RELEASE_CHILDREN sigsetmask(0)
#endif
#if USE_WAIT3
void wait_block()
{
HOLD_CHILDREN;
}
void wait_clear(RETSIGTYPE (*func)(int))
{
RELEASE_CHILDREN;
}
void wait_restore()
{
signal(SIGCHLD, SIG_DFL);
RELEASE_CHILDREN;
}
#else
void wait_block()
{
signal(SIGCHLD, SIG_DFL);
}
void wait_clear(RETSIGTYPE (*func)(int))
{
signal(SIGCHLD, func);
}
void wait_restore()
{
signal(SIGCHLD, SIG_DFL);
}
#endif
void wait_reap( void (*func)(pid_t, int), RETSIGTYPE (*handler)(int))
{
int dummy;
pid_t p;
#if USE_WAIT3
HOLD_CHILDREN;
while ((p=wait3(&dummy, WNOHANG, 0)) > 0)
#else
if ((p=wait(&dummy)) > 0)
#endif
{
(*func)(p, dummy);
}
signal(SIGCHLD, handler);
#if USE_WAIT3
RELEASE_CHILDREN;
#endif
}
void wait_forchild( void (*reap)(pid_t, int), RETSIGTYPE (*func)(int))
{
pid_t p;
int wait_stat;
signal(SIGCHLD, SIG_DFL);
p=wait(&wait_stat);
signal(SIGCHLD, func);
(*reap)(p, wait_stat);
}
|