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(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);
}
|