pthread_atfork_test.c [plain text]
#include <assert.h>
#include <pthread.h>
#include <sys/types.h>
#include <sys/wait.h>
static int parentval = 0;
static int childval = 0;
static void prepare1(void)
{
parentval *= 2;
}
static void prepare2(void)
{
parentval = 3;
}
static void parent1(void)
{
parentval += 4;
}
static void parent2(void)
{
parentval *= 3;
}
static void child1(void)
{
childval = 5;
}
static void child2(void)
{
childval *= 3;
}
int
main(void)
{
pid_t pid, child;
int status;
assert(!pthread_atfork(prepare1, parent1, child1));
assert(!pthread_atfork(prepare2, parent2, child2));
pid = fork();
assert(pid >= 0);
if (pid == 0) {
_exit(childval);
} else {
child = waitpid(pid, &status, 0);
assert(child == pid);
assert(WIFEXITED(status));
assert(WEXITSTATUS(status) == 15);
assert(parentval == 30);
}
return 0;
}