23#include "wvlinklist.h"
25#define MAX_FD sysconf(_SC_OPEN_MAX) + 1
27DeclareWvList(WvForkCallback);
28static WvForkCallbackList *callbacks;
34 {
if (callbacks)
delete callbacks; }
43static WvForkCallbackList &get_callbacks()
46 callbacks =
new WvForkCallbackList;
55 WvForkCallbackList::Iter i(get_callbacks());
56 for (i.rewind(); i.next(); )
59 get_callbacks().append(
new WvForkCallback(cb),
true);
63void remove_wvfork_callback(WvForkCallback cb)
65 WvForkCallbackList::Iter i(get_callbacks());
66 for (i.rewind(); i.next(); )
67 if (*i == cb) i.xunlink();
71pid_t
wvfork(
int dontclose1,
int dontclose2)
75 t.add(&dontclose1,
false);
77 t.add(&dontclose2,
false);
85 if (pipe(waitpipe) < 0)
90 WvForkCallbackList::Iter i(get_callbacks());
91 for (i.rewind(); i.next(); )
93 WvForkCallback *cb = i.ptr();
105 read(waitpipe[0], &buf, 1);
112 *waitfd = waitpipe[1];
118pid_t
wvfork(intTable &dontclose)
131 for (
int fd = 0; fd < MAX_FD; fd++)
133 if (!dontclose[fd] && fd != waitfd &&
134 (fcntl(fd, F_GETFD) & FD_CLOEXEC) > 0)
pid_t wvfork_start(int *waitfd)
wvfork_start is just like fork, except that it will block the parent until the child process closes t...
pid_t wvfork(int dontclose1=-1, int dontclose2=-1)
wvfork() just runs fork(), but it closes all file descriptors that are flagged close-on-exec,...
void add_wvfork_callback(WvForkCallback cb)
Register a callback to be called during wvfork.