#include #include #include #include #include #include static void reaptest(void); int main(int ac, char **av) { union reaper_info info; int r; int status; pid_t pid; r = procctl(P_PID, getpid(), PROC_REAP_STATUS, &info); printf("result %d flags=%08x refs=%d head_pid=%d\n", r, info.status.flags, info.status.refs, info.status.pid_head); r = procctl(P_PID, getpid(), PROC_REAP_ACQUIRE, NULL); printf("result = %d %d\n", r, errno); reaptest(); while ((pid = wait3(&status, 0, NULL)) > 0 || errno == EINTR) { printf("reaped pid %d\n", pid); r = procctl(P_PID, getpid(), PROC_REAP_STATUS, &info); printf("result %d flags=%08x refs=%d head_pid=%d\n", r, info.status.flags, info.status.refs, info.status.pid_head); } sleep(5); printf("OK DONE WITH TEST1\n"); r = procctl(P_PID, getpid(),PROC_REAP_RELEASE, NULL); printf("result = %d %d\n", r, errno); reaptest(); while ((pid = wait3(&status, 0, NULL)) > 0 || errno == EINTR) { printf("reaped pid %d\n", pid); r = procctl(P_PID, getpid(), PROC_REAP_STATUS, &info); printf("result %d flags=%08x refs=%d head_pid=%d\n", r, info.status.flags, info.status.refs, info.status.pid_head); sleep(5); } return 0; } static void reaptest(void) { if (fork() == 0) { printf("primary pid %d\n", getpid()); if (fork() == 0) { sleep(1); printf("secondary pid %d\n", getpid()); if (fork() == 0) { procctl(P_PID, getpid(), PROC_REAP_ACQUIRE, NULL); if (fork() == 0) { if (fork() == 0) { sleep(3); exit(5); } sleep(2); exit(5); } sleep(1); exit(5); } exit(2); } exit(1); } if (fork() == 0) { sleep(2); exit(1); } }