/* * Starts any programs with PR_SET_CHILD_SUBREAPER on Linux. * Author: Yuuta Liang */ #define _POSIX_C_SOURCE 200809L #define _GNU_SOURCE #include #include #include #include #include #include #ifndef TEST int main(int argc, char **argv) { int r; assert(argc); if (argc == 1) errx(64, "Usage: %s /path/to/binary [arg1] [arg2] ...", argv[0]); if ((r = prctl(PR_SET_CHILD_SUBREAPER, 1) < 0)) err(errno, "prctl(PR_SET_CHILD_SUBREAPER)"); if ((r = execve(argv[1], &argv[1], environ))) err(errno, "exec(%s)", argv[1]); } #else /* ifndef TEST */ #include int main(void) { printf("Parent PID: %d\n", getpid()); if (!fork()) { printf("Fork PID: %d\n", getpid()); unsigned int counter = 0; goto f; f: counter ++; if (!fork()) { printf("Child PID: %d\n", getpid()); pause(); } if (counter < 20) goto f; exit(0); } pause(); } #endif /* ifndef TEST */