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 97 98 99 100 101 102 103 104 105 106 107 108 109 110
|
/*
** Copyright 1998 - 2005 Double Precision, Inc.
** See COPYING for distribution information.
*/
#ifndef INCLUDED_FROM_CONFIGURE
#include "waitlib.h"
#endif
#include <signal.h>
#include <stdio.h>
#if HAVE_SIGPROCMASK
#define HOLD_CHILDREN {\
sigset_t ss; sigemptyset(&ss); sigaddset(&ss, SIGCHLD); \
sigprocmask(SIG_BLOCK, &ss, NULL);\
}
#define RELEASE_CHILDREN {\
sigset_t ss; sigemptyset(&ss); sigaddset(&ss, SIGCHLD); \
sigprocmask(SIG_UNBLOCK, &ss, NULL);\
}
#else
#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
#endif
#if USE_WAIT3
void wait_block()
{
HOLD_CHILDREN;
}
void wait_clear(void (*func)(int))
{
RELEASE_CHILDREN;
}
void wait_restore()
{
signal(SIGCHLD, SIG_DFL);
RELEASE_CHILDREN;
}
#else
void wait_block()
{
signal(SIGCHLD, SIG_DFL);
}
void wait_clear(void (*func)(int))
{
signal(SIGCHLD, func);
}
void wait_restore()
{
signal(SIGCHLD, SIG_DFL);
}
#endif
void wait_reap( void (*func)(pid_t, int), void (*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), void (*func)(int))
{
pid_t p;
int wait_stat;
signal(SIGCHLD, SIG_DFL);
p=wait(&wait_stat);
signal(SIGCHLD, func);
(*reap)(p, wait_stat);
}
|